相关函数原型(从控制台获取输入,不考虑宽字符):数组
int scanf( const char *format, ... ); int getchar(void); char *gets( char *str ); char *gets_s( char *str, rsize_t n ); char *fgets( char *str, int count, FILE *stream );
\0
;该函数能够从标准输入读取内容,返回值为读取的参数个数,例如:函数
#include <stdio.h> int main() { int seed; printf("%d\n", scanf("%d %d", &seed, &seed)); }
运行程序,输入 两个整数,打印为 2,测试输入3个值仍然打印2,是由于这个"%d %d"指定了只解析两个int,多余的将留在缓冲区中,若是后面再写一个scanf,将从缓冲区中继续解析。测试
如今多加一个scanf
:指针
#include <stdio.h> int main() { int seed; printf("%d\n", scanf("%d %d", &seed, &seed)); printf("%d\n", scanf("%d %d", &seed, &seed)); }
1
输出:code
1 -1
scanf从缓冲区中解析,返回解析成功的参数个数,由于只有一个1,因此第一个给scanf解析,第一行打印1,第二行解析的时候因读取到了文件结束表示EOF
返回-1。orm
f
输出:字符串
0 0
这说明,解析失败的内容还留在缓冲区给下次scanf用,因此两个scanf都返回的0。get
由于没法解析的值会继续留在缓冲区供下次使用,因此若是是循环scanf
,程序就会跑飞,让你没有输入的机会,可使用综上一节提供的示例测试一下,运行后直接输入f
。原型
1 2 3 4 5 6 7
输出:string
2 2
这代表,返回值最大是占位符的个数,剩下的内容还留在缓冲区。
scanf
判断输入结束,只能在文件输入模式下利用EOF
判断,例如:
// qwer.c #include <stdio.h> int main() { int a; while(scanf("%d", &a) != EOF) { printf("%d\n", a); } return 0; }
输入文件test.txt
内容:
1 2 3 4
编译: gcc qwer.c -o main -std=c11
。
运行:./main < test.txt
。
这个函数能够从输入缓冲区仅读取一个字符,返回int,后面结合fgets
使用。
在读取字符串时,scanf()
和转换说明%s
只能读取一个单词,但是程序中常常要读取一整行输入。gets
函数简单易用,它读取整行输入,直到遇到换行符,而后丢弃换行符,存储其他字符,并在这些字符的末尾添加一个空字符使其成为一个c字符串。它常常和puts
函数配对使用,该函数用于显示字符串,并在末尾添加换行符。
#include <stdio.h> #define STLEN 81 int main() { char words[STLEN]; puts("Enter a string, please."); gets(words); // 典型用法 printf("Your string twice:\n"); printf("%s\n", words); puts(words); puts("Done."); return 0; }
printf("%s\n", words);
和puts(words);
效果相同,可是编译的时候会产生警告,由于gets
读取整行输入,并不知道words
能存多少,若是输入字符串过长,会致使缓冲区溢出。
例如将STLEN
设置成5
,程序依然能够运行,尝试输入过长的数据就可能会发成溢出,最直观的就是能够看到发生段溢出后程序异常退出。
该函数是c11才有的,且为拓展函数,使用方式除了能够设置读取的字符数以外和gets
函数用法同样。
这个函数除了能够从标准输入读取字符串以外,还能够从文件中读取,并且能够指定读取字符个数,比gets_s
更加灵活易用,利用fgets
,可是fgets
不会自动丢弃超过字符个数以外的行缓冲区数据,因此要配合getchar
将剩余的缓冲数据丢弃,不然可能形成程序运行以异常。
为知足如下几点编写自定义输入:
char *s_gets(char *str, int n) { char *ret_var; int i = 0; ret_var = fgets(str, n, stdin); if(ret_var) { while(str[i] != '\n' && str[i] != '\0') { i++; } if(str[i] == '\n') str[i] = '\0'; else while(getchar() != '\n') continue; } return ret_var; }
使用方式
#include <stdio.h> #define STLEN 8 int main() { char words[STLEN]; while(s_gets(words, STLEN) && words[0] != '\n') // 没有输入数据会自动退出程序 { puts(words); } return 0; }