首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言結構體輸入:scanf 格式字符串錯誤與 gets 混用導致緩衝區殘留

     編輯:程式設計綜合問答

錯誤代碼


scanf("%d", &stu[i].num);
gets(stu[i].name);        // ❌ 讀取上一行殘留的 \n
scanf("%.2f", &stu[i].score); // ❌ 格式錯誤,%f 不接受精度

三大問題

  1. scanf("%d") 留下 \n,gets 讀到空行。
  2. gets 已棄用(緩衝區溢出風險),應用 fgets。
  3. scanf("%.2f") 非法,浮點輸入用 %f 或 %lf。

修正版


scanf("%d", &stu[i].num);
getchar(); // 吞掉 \n
fgets(stu[i].name, sizeof(stu[i].name), stdin);
stu[i].name[strcspn(stu[i].name, "\n")] = '\0'; // 去尾部 \n
scanf("%f", &stu[i].score);
getchar(); // 吞掉 \n

最佳實踐:整行讀取 + sscanf


char line[256];
fgets(line, sizeof(line), stdin);
sscanf(line, "%d %s %f", &stu[i].num, stu[i].name, &stu[i].score);
// 注意:%s 遇空格截斷,姓名含空格需用分隔符或 fgets 解析
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved