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

C 語言指針數組陷阱:scanf 格式符導致輸入失效

     編輯:程式設計綜合問答

問題現象

編寫二維數組輸入並計算平均值的程序,無論輸入什麼數值,輸出的總和恆為 0。代碼片段如下:

float score[3][4];
for (int i = 0; i < 3; ++i)
    for (int j = 0; j < 4; ++j)
        scanf("%d", &score[i][j]);  // 錯誤:%d 對應 int,但 score 是 float
average(*score, 12);

根因分析

  • score 類型為 float[3][4],元素佔 4 字節。
  • scanf("%d", ...) 期望寫入 4 字節 int,但按整數格式解析輸入,導致浮點數位模錯誤,實際內存寫入的是整數表示,而非浮點數值。
  • 傳遞給 average 的指針指向的內存內容已非合法浮點數,累加結果為 0 或亂碼。

修正方案

將格式符改為 %f:

scanf("%f", &score[i][j]);  // 正確匹配 float

或使用 C++ 風格輸入避免格式符錯誤:

cin >> score[i][j];

延伸建議

  1. 啟用編譯器警告(-Wall -Wextra 或 /W4),可在編譯期捕獲格式符不匹配。
  2. 傾向使用 std::vector<std::vector<float>> 替代原始數組,配合範圍 for 循環降低出錯概率。
  3. 函數參數 float (*p_ave) 實為 float*,調用時傳 score[0] 或 &score[0][0] 更清晰。

總結

格式字符串與實際變量類型嚴格對應是 C 語言輸入輸出的基石。本例中 %d 與 float 不匹配導致數據解析錯誤,改為 %f 即可解決。養成開啟高警告級別編譯的習慣,能避免 90% 此類低級錯誤。

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