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

C 語言字符加密與 scanf 緩衝區陷阱:回車符殘留導致輸入跳過完整解析

     編輯:程式設計綜合問答

代碼現象

  • 輸入 "class" 加密後首字符異常、末字符丟失。
  • while 循環第二輪直接跳過 scanf("%c", &a[i])。
  • 加 scanf("%c", &k) 吸收回車後行為改變但仍不正確。

根本原因:scanf 留下的換行符

scanf("%d", &n) 讀取整數後,**換行符 '\n' 滯留在 stdin 緩衝區**。緊接的 scanf("%c", &a[0]) 直接讀取該 '\n' 作為第一個字符,導致實際字符串向後偏移一位,最後一位讀不到。

標準解決方案

scanf("%d", &n);
getchar(); // 吸收單個殘留換行符

// 或更穩健:讀取整行再解析
char line[256];
fgets(line, sizeof(line), stdin);
sscanf(line, "%d", &n);

字符輸入最佳實踐

  • 避免混用 %d 和 %c,改用 fgets 讀整行,sscanf/strtok 解析。
  • 若必須用 scanf,在每次 %c 前加 getchar() 或用 " %c"(前置空格跳過空白字符)。
  • 主函數返回值:C99 起 main 缺省 return 0;,編譯器自動插入;建議顯式寫出以提高可讀性。

加密邏輯修正

for (i = 0; i < n; i++) {
    scanf(" %c", &a[i]); // 前置空格跳過空白
    a[i] = a[i] + 4;
}

徹底理解 stdin 緩衡機制,是 C 語言輸入處理無 Bug 的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved