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

C 語言 scanf 與 char 陣列:手動輸入自帶 \\n 結束,初始化無 \\0 導致輸出亂碼

     編輯:程式設計綜合問答

三個實驗:初始化 `char w0[2]={'a','a'}` 輸出亂碼;`scanf("%2s", w1)` 輸入 `aa` 輸出正常;函式內 `scanf` 後 `printf` 又亂碼。

核心差異

  • **初始化**:只給字元,無 `\0`,`printf("%s")` 讀到記憶體隨機資料直到遇 `\0`。
  • **手動輸入**:`scanf("%2s")` 讀 2 字元後**自動補 `\0`**(標準規定),且使用者按 Enter 產生 `\n` 留在緩衝區,但 `%s` 已停止讀取。
  • **函式內 `scanf` 後亂碼**:實驗 3 中 `sub1` 的 `w1` 是區域陣列,**未初始化**,`scanf("%2s")` 寫入 2 字元 + `\0`(共 3 位元組),但陣列大小只有 2,**緩衝區溢位**破壞棧幀,導致後續 `printf` 行為未定義。

教訓

  1. 字串陣列大小 **≥ 最大長度 + 1(給 `\0`)**。
  2. `scanf("%Ns")` N 應為 `size-1`。
  3. **字串結束符 `\0` 是第一約束**,非陣列大小。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved