使用fputs()写入文件遇输入异常,无法获取后续学生姓名求助
问题分析与解决方案
问题根源
你遇到的问题是输入缓冲区残留的换行符导致的:
- 第一次输入完绩点后按下回车,
scanf("%f", &cgpa)只会读取浮点数,回车产生的换行符会留在输入缓冲区中。 - 第二次循环调用
gets(name)时,gets会直接读取这个残留的换行符作为输入,所以看起来像是跳过了姓名输入,实际上已经读取了一个空字符串。
解决方法
方法1:清除scanf后的换行符
在每次scanf读取绩点后,调用getchar()吃掉缓冲区里的换行符,修改后的关键代码如下:
printf("Enter students cgpa: "); scanf("%f", &cgpa); getchar(); // 清除输入缓冲区中残留的换行符 fprintf(fp, " %0.2f", cgpa);
方法2:替换不安全的gets函数(推荐)
gets函数已被C标准废弃,存在缓冲区溢出风险,建议用fgets替代,同时处理换行符问题,完整代码如下:
#include <stdio.h> #include <string.h> // 需要strchr函数 int main(){ FILE *fp; char name[25]; int i; float cgpa; fp = fopen("FileExercise.txt", "w"); if(fp==NULL) printf("File doesn't exist.\n"); else{ printf("File has opened.\n"); for(i=0; i<5; i++){ printf("Enter roll-%d student name: ", i+1); // 用fgets读取姓名,支持带空格的输入 fgets(name, sizeof(name), stdin); // 去除fgets读取到的末尾换行符 char *newline_pos = strchr(name, '\n'); if(newline_pos != NULL){ *newline_pos = '\0'; } fputs(name, fp); fprintf(fp, " %d", i+1); printf("Enter students cgpa: "); scanf("%f", &cgpa); getchar(); // 清除换行符,避免影响下一次fgets fprintf(fp, " %0.2f", cgpa); fprintf(fp, "\n"); } printf("File has written successfully.\n"); } return 0; }
方法3:用scanf直接读取姓名(不支持带空格)
如果不需要支持带空格的姓名,可以用scanf("%24s", name)替代gets,同时在scanf前加空格跳过空白字符:
printf("Enter roll-%d student name: ", i+1); scanf(" %24s", name); // 前面的空格跳过缓冲区里的换行符
内容的提问来源于stack exchange,提问作者Shah Alam
相关产品推荐
相关产品推荐

