scanf读取行数后fgets需额外按回车的问题解决咨询
scanf读取整数后fgets需额外回车的问题解决
现象是否正常?
这是正常现象。原因是scanf("%d", &line_count)仅读取输入中的数字部分,你输入数字后按下的回车(即换行符\n)会残留在标准输入缓冲区中。后续调用fgets时,它会优先读取缓冲区里的这个换行符,相当于第一次fgets直接读取了一个空行,因此你需要额外按一次回车才能输入真正的内容。
解决方法
方案一:手动清除缓冲区残留的换行符
在scanf读取整数后,添加代码清空缓冲区中剩余的字符(直到换行符):
// 清除scanf留下的换行符 while ((getchar()) != '\n');
修改后的完整代码:
int main() { FILE *myfile; myfile = fopen("test.txt", "w"); int line_count; printf("Enter number of line:"); scanf("%d", &line_count); // 清除缓冲区中残留的换行符 while ((getchar()) != '\n'); if (myfile == NULL) { printf("Can't create!"); return 1; } char line[100]; for (int i = 0; i < line_count; i++) { fgets(line, sizeof(line), stdin); fprintf(myfile, "Line %d: %s", i+1, line); // 补充写入用户输入的内容,原代码未包含 } fclose(myfile); return 0; }
方案二:用fgets读取整行后转成整数
完全避免使用scanf读取数字,先用fgets读取包含数字的整行输入,再通过sscanf将字符串转换为整数,从根源上避免缓冲区残留问题:
int main() { FILE *myfile; myfile = fopen("test.txt", "w"); int line_count; char input[100]; printf("Enter number of line:"); fgets(input, sizeof(input), stdin); sscanf(input, "%d", &line_count); if (myfile == NULL) { printf("Can't create!"); return 1; } char line[100]; for (int i = 0; i < line_count; i++) { fgets(line, sizeof(line), stdin); fprintf(myfile, "Line %d: %s", i+1, line); } fclose(myfile); return 0; }
内容的提问来源于stack exchange,提问作者Alpiinoo
相关产品推荐
相关产品推荐

