一直想吐槽C语言那恶心的输入的,初学时大量时间都花在了处理输入数据的问题上,看人家的语言,输入多么简单,可是C容易出错,写起来还麻烦。虽然如此,但是C的效率还是没得说的。
输入的基础靠的是函数,根据不同数据情况选择不同的输入方式,有时也要考虑到数据结构选择适当的输入方式。
在此,好好分析一下C的输入函数:
首先输入的函数有:scanf,getc,getchar,gets,fgets,fgetc,fscanf
等,输出是与之对应的printf,putc,putchar,puts,fputs,fputc,fprintf
等。
scanf
相对来说对于有一定格式的数据一般采用scanf输入,函数原型是int scanf(const char *format, arg_list)
参数是为指定的参数格式及参数类型,相当于一种匹配,匹配控制台输入的所有东西。遵从最长匹配,只要之后的字符或数字等满足需要匹配的%*就会被匹配了去。
1.常常犯的错误是两个%1%2,%2的被%1给匹配掉了,所以出了错,举个例子:scanf("%s%c", &a, &b);
就无法读入b。
2.读入的时候可以用空格略掉一个至多个空白字符。
3.scanf是以空格和回车作为结束匹配的标志,但是%c能读入空白字符,包括空格和回车,这个很容易犯错,没有读入的字符,输出时会看到很多很多“烫“。
4.scanf函数的返回值为成功赋值的个数,出错返回EOF。在写程序时,可以通过返回的参数来判断用户输入是否正确。
以上是我的一些心得,以后遇到再补充。
如果需要详细了解scanf函数所有用法,推荐scanf()函数详解
getc
函数原型:int getc(FILE *fp),
功能是从文件读出一个字符。
1.常用于判断文件是否读完:(ch = getc(fp)) != EOF
。
2.当fp为stdin时,getc(stdin)
就等同于getchar()
。
getchar
getchar功能是从标准输入流读取一个字符。
1.并不是在屏幕中敲上一个字符程序就会运行,一般是通过在屏幕上敲上回车键,然后将回车前的字符串送至缓冲区中,getchar从缓冲区中一个一个的读字符。
2.可以在while循环中指定终止字符,例如:while ((c = getchar()) != '\r' && c != '\n')
这是以回车来结束的。
gets
函数原型:char * gets(char *str)
,功能:从标准输入流读取字符串并回显。
1.读到换行符时退出,并会将换行符省去。
2.现在大多说gets有害论,不建议用gets,会造成溢出错误,常见于黑客攻击和反向工程。
3.现在用fges代替,但是不完全等同,fgets带换行符。
fgets
函数原型:char *fgets(char *str, int num, FILE *fp)
,参数说明:str是存放读入的字符数组指针,num是最大允许的读入字符数,fp是文件指针。功能:读一行字符,该行的字符数不大于num-1。
1.会在末尾加上一个空字符以构成一个字符串。
2.在读取到换行符后不会将其省略。
3.gets(s);
相当于
fgets(s, sizeof(s), stdin);
if(s[strlen(s) - 1] == '\n') s[strlen(s) - 1] = '\0'; // 去掉换行符
其实,末尾这个换行符是另有妙用的。
fgetc
函数原型:int fgetc(FILE *fp)
,功能:从fp的当前位置读取一个字符。
fscanf
函数原型:int fscanf(FILE *fp, char *format,...)
,功能:按照指定格式从文件中出读出数据,并赋值到参数列表中。参见scanf。