user-0 提问: fgets读取文本文件结束后,再次调用gets函数想键盘输入,却直接读到'\0',为何??

回复:
user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

user: user-2
content: 引用 3 楼 berger 的回复:[quote=引用 2 楼 user-2的回复:]The gets function reads a line from the standard input stream stdin and stores it in buffer. The line consists of all characters up to and including the first newline character ('\n').   gets then replaces the newline character with a null character ('\0') before returning the line. In contrast, the fgets function retains the newline character.   _getws is a wide-character version of gets; its argument and return value are wide-character strings. 感谢回复，想了想，应该是前面的两次scanf留下的换行符被读了进来，但scanf一共调用了两次，第二次scanf调用时应该因为缓冲区内还有换行符，无法读取数字一直循环吧？为什么第二次调用可以正常进行呢？……[/quote]前两次scanf都是%d格式化了，不会读入换行符等空字符

user: user-0
content: 引用 9 楼 user-2的回复:。。。看错了 前面两次scanf调用，缓冲区里有残留的＼n，所以后面第一次gets异常，但我不懂两次调用scanf，不应该缓冲区内残留两个换行符吗？为什么只有一个？是第二次scanf时要刷新输入缓冲区吗？

user: user-2
content: 。。。看错了

user: user-2
content: 引用 6 楼 berger 的回复:[quote=引用 4 楼 user-2的回复:][quote=引用 3 楼 berger 的回复:] [quote=引用 2 楼 user-2的回复:]The gets function reads a line from the standard input stream stdin and stores it in buffer. The line consists of all characters up to and including the first newline character ('\n').   gets then replaces the newline character with a null character ('\0') before returning the line. In contrast, the fgets function retains the newline character.   _getws is a wide-character version of gets; its argument and return value are wide-character strings. 感谢回复，想了想，应该是前面的两次scanf留下的换行符被读了进来，但scanf一共调用了两次，第二次scanf调用时应该因为缓冲区内还有换行符，无法读取数字一直循环吧？为什么第二次调用可以正常进行呢？……[/quote]前两次scanf都是%d格式化了，不会读入换行符等空字符[/quote] 嗯，知道了，那么两次连续读取整形数，缓冲区应该有两个换行符残留吧？为什么用scanf("%c",&ch)这种语句去读只能读到一个＼n呢？后一个scanf执行后就是等待输入状态了，另一个\n呢？……  在不同编译器里也试了下，一样，何解？[/quote]The gets function reads a line from the standard input stream stdin，这里写的不是read a char，大概是这个原因吧 没有深究

user: user-0
content: 引用 5 楼 赵4老师的回复:printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0]; 感谢回复！记得了～～～

user: user-0
content: 引用 4 楼 user-2的回复:[quote=引用 3 楼 berger 的回复:] [quote=引用 2 楼 user-2的回复:]The gets function reads a line from the standard input stream stdin and stores it in buffer. The line consists of all characters up to and including the first newline character ('\n').   gets then replaces the newline character with a null character ('\0') before returning the line. In contrast, the fgets function retains the newline character.   _getws is a wide-character version of gets; its argument and return value are wide-character strings. 感谢回复，想了想，应该是前面的两次scanf留下的换行符被读了进来，但scanf一共调用了两次，第二次scanf调用时应该因为缓冲区内还有换行符，无法读取数字一直循环吧？为什么第二次调用可以正常进行呢？……[/quote]前两次scanf都是%d格式化了，不会读入换行符等空字符[/quote] 嗯，知道了，那么两次连续读取整形数，缓冲区应该有两个换行符残留吧？为什么用scanf("%c",&ch)这种语句去读只能读到一个＼n呢？后一个scanf执行后就是等待输入状态了，另一个\n呢？……  在不同编译器里也试了下，一样，何解？

user: user-2
content: The gets function reads a line from the standard input stream stdin and stores it in buffer. The line consists of all characters up to and including the first newline character ('\n').   gets then replaces the newline character with a null character ('\0') before returning the line. In contrast, the fgets function retains the newline character.   _getws is a wide-character version of gets; its argument and return value are wide-character strings.

user: user-0
content: 引用 2 楼 user-2的回复:The gets function reads a line from the standard input stream stdin and stores it in buffer. The line consists of all characters up to and including the first newline character ('\n').   gets then replaces the newline character with a null character ('\0') before returning the line. In contrast, the fgets function retains the newline character.   _getws is a wide-character version of gets; its argument and return value are wide-character strings. 感谢回复，想了想，应该是前面的两次scanf留下的换行符被读了进来，但scanf一共调用了两次，第二次scanf调用时应该因为缓冲区内还有换行符，无法读取数字一直循环吧？为什么第二次调用可以正常进行呢？……

user: user-0
content: 手机端看不到颜色标注，是指定fp2的前一句gets调用～