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

C 語言新手 scanf 格式字串陷阱:方括號是說明非輸入

     編輯:程式設計綜合問答

錯誤代碼


int num;
scanf("[%d]", &num); // 錯誤:嘗試匹配字面字元 '[' ']' 

錯誤原因

教材/文檔中常用**方括號 `[ ]` 表示參數可選**,例如:


scanf(format[, address]...); // 方括號內容可省略

**新手誤以為要輸入方括號**,實際格式字串應為 `"%d"`。

scanf 格式字串核心規則

格式含義對應參數類型
`%d` / `%i`有符號十進位整數`int *`
`%ld`長整數`long *`
`%f` / `%lf`浮點數 (float/double)`float *` / `double *`
`%c`單一字元 (含空白)`char *`
`%s`字串 (至空白)`char *` (需預留空間)
`%[...]`掃描集合 (如 `%[^\n]` 讀整行)`char *`

常見新手錯誤與修正

錯誤代碼問題修正
`scanf("%d", num);`缺 `&` 取址`scanf("%d", &num);`
`scanf("%s", str);` (str 未分配)野指針寫入`char str[100]; scanf("%99s", str);`
`scanf("%c", &ch);` 吃掉換行上一殘留 `\n``scanf(" %c", &ch);` (前加空格跳過空白)
`scanf("%d\n", &n);`尾部 `\n` 導致需額外輸入`scanf("%d", &n);`

安全輸入最佳實踐


// 1. 檢查返回值 (成功轉換個數)
if (scanf("%d", &num) != 1) {
    // 處理輸入失敗:清空緩衝區
    while (getchar() != '\n');
    return ERROR;
}

// 2. 限制字串長度防溢出
char name[20];
scanf("%19s", name); // 最多讀 19 字元 + \0

// 3. 讀整行 (含空格)
char line[100];
scanf(" %99[^\n]", line); // 先跳過空白,再讀非換行字元

// 4. 完整輸入驗證循環
int getInt(const char* prompt) {
    int val, rc;
    while (1) {
        printf("%s", prompt);
        rc = scanf("%d", &val);
        while (getchar() != '\n'); // 清空行尾
        if (rc == 1) return val;
        printf("輸入無效,請重新輸入整數。\n");
    }
}

總結

  • **方括號在語法說明中 = 可選**,代碼中**不要輸入**。
  • 永遠檢查 `scanf` 返回值,失敗時**必須清空輸入緩衝區**否則陷入無限循環。
  • 字串輸入**必須限制寬度** (`%19s`),預留結束符空間。
  • 善用 `fgets` + `sscanf` 替代 `scanf` 處理複雜行輸入,更健壯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved