getchar、fgetc、gets、fgets、scanf、sscanf、fscanf 骑猪看日落 2021-12-11 07:07 217阅读 0赞 原文网址:[getchar、fgetc、gets、fgets、scanf、sscanf、fscanf\_IT利刃出鞘的博客-CSDN博客][getchar_fgetc_gets_fgets_scanf_sscanf_fscanf_IT_-CSDN] # getchar # 函数原型:int getchar(void); 作用:从标准输入里读取下一个字符,相当于getc(stdin)。返回类型为int型,为用户输入的ASCII码或EOF。 例: while ((c = getchar()) != '\\n') printf("%c", c); \} do \{ c = getchar(); \} while ((c != 'a') && (c != 'l') && (c != 'x')) 详解: getchar函数的返回值是用户输入的字符的ASCII码,若文件结尾(End-Of-File)则返回-1(EOF),且将用户输入的字符回显到屏幕。如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取。也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才等待用户按键。 # fgetc # 函数原型:int fgetc(FILE \*stream); 作用:从文件指针stream指向的文件中读取一个字符,读取一个字节后,并把位置标识符往前移动一个字节。 该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。 例: c = fgetc(stdin) fp = fopen("file.txt","r"); c = fgetc(fp); 详解: 虽然返回一个字节,但返回值不为unsigned char的原因为,返回值要能表示-1(即为EOF)。 会休眠,直到有输入。此函数默认就是阻塞方式打开,函数相当于读函数,没有数据,则会休眠。 # gets # 函数原型:char \*gets(char \*buffer); 作用:从stdin流中读字符串,直至接收到换行符或EOF时停止,读的结果存放在buffer指向的字符串 例: char str\[10\]; gets(str); 详解: 换行符不作为读取串的内容,读取的换行符被转换为null值。gets函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值,为了避免这种情况,我们可以用fgets()来替换gets()(在linux下,程序中用gets(),编译会有warning: the \`gets' function is dangerous and should not be used)。 # scanf # 函数原型:int scanf(const char \*format, ...); 作用:从stdin中读字符串,将地址赋给s。 例: char str\[10\]; scanf("%s",&s) 详解: 没有输入会休眠,输入回车才返回。与gets(s)函数相似,但不完全相同,使用scanf("%s",&s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。 # sscanf # 函数原型:int sscanf(const char \*str, const char \*format, ...); 作用:从固定的字符串中读出。 返回值: 成功:成功赋值的字段个数(不包括已读但没有赋值的字段个数),0表示没有给任何字段赋值。 失败:返回-1。如果buffer或format是NULL调用指针,则返回 -1 例: char str\[20\] = "ab cde fg hij"; int ret1; char str1\[20\]; char str2\[20\]; char str3\[20\]; char str4\[20\]; char str5\[20\]; ret = sscanf(str, "%s %s %s %s %s", str1, str2, str3, str4, str5); 此时,ret = 4(因为没有转化到str5);str1\[20\] = "ab"; str2\[20\] = "cde"; str3\[20\] = "fg"; str4\[20\] = "hij" # fscanf # 函数原型:int fscanf(FILE \*stream, const char \*format, ...) 作用:根据数据格式(format)从输入流(stream)(文件或者标准输入)中写入数据(argument) 例: int i; fscanf(stdin, "%d", &i); 详解: fscanf遇到空格和换行时结束,注意空格时也结束,fgets遇到空格不结束 # fgets # 函数原型:char \*fgets(char \*s, int size, FILE \*stream) 作用:既可以用来从文件中读入字符串,也可以从屏幕上输入一字符串。 例:fgets(str,n,fp); str是存放在字符串的起始地址; n是一个int类型变量,表示读取字符串字符的最大数量 fp是文件指针(此参数写成stdin即从屏幕取词); 函数的功能是从fp所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满n-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符(这就是为什么第二个参数是n,而最多只能读入n-1个字符的原因,这个地方一定要注意,如下代码: int len; char str\[128\]; fgets(str,128,stdin); len = strlen(str); printf("len= %d\\n", len); 如果是在标准输入里输入abcd回车 输出结果是:5而不是4。 所以在需要用到字符串长度的时候要特别注意下。 )。 因此,确切地说,调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加'\\0',并以str作为函数值返回。 其他: 不需要输入回车来获取输入的方式 网页收藏 Non-blocking user input... 参考此网页第三部分代码(nonblock函数,此函数中含有进入此模式和退出此模式的代码),写到stdin.c中的init和exit函数中去。里 边的几个函数,用man ...来查找 返回时,用select,网页收藏 Non-blocking user input... 参考此网页第一部分代码(kbhit函数) select函数详细讲解见《unix环境高级编程》 获得输入的字符的函数,见网页收藏 Non-blocking user input... 第四部分(main), 用的c = fgetc(stdin) [getchar_fgetc_gets_fgets_scanf_sscanf_fscanf_IT_-CSDN]: https://knife.blog.csdn.net/article/details/95353320
还没有评论,来说两句吧...