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

C語言查找最長字符串:scanf 緩衝區殘留換行符導致邏輯錯誤的修復實戰

     編輯:C 語言問答

題目要求

輸入 repeat 組測試數據,每組輸入 n 個字符串,輸出最長者(同長取先輸入)。

原代碼核心缺陷


scanf("%d", &repeat);
for (ri = 1; ri <= repeat; ri++) {
    scanf("%d", &n);
    scanf("%s", sx);  // ❌ 讀取首字符串前,緩衝區殘留 '\n'
    for (i = 0; i < n; i++) {  // ❌ 應從 1 開始,首串已讀
        scanf("%d", longest);  // ❌ 格式符錯誤,應為 %s
        // ...
    }
}

問題根因分析

  1. scanf("%d", &n) 讀取整數後,**換行符 \n 留在緩衝區**
  2. 後續 scanf("%s", sx) 遇到 \n 視為空白,**跳過並等待下一輸入**,導致首字符串實際讀取的是第二行
  3. 循環索引 i=0 重複處理首字符串
  4. scanf("%d", longest) 格式符與字符串數組類型不匹配,導致未定義行為

修正版代碼


#include 
#include 

int main(void) {
    char sx[80], longest[80];
    int i, n, repeat, ri;

    scanf("%d", &repeat);
    for (ri = 1; ri <= repeat; ri++) {
        scanf("%d", &n);
        getchar();  // ✅ 吞掉殘留的 '\n',或用 while(getchar()!='\n');
        
        scanf("%s", sx);  // 讀取第一個字符串
        for (i = 1; i < n; i++) {  // ✅ 從 1 開始,共再讀 n-1 個
            scanf("%s", longest);  // ✅ 正確格式符
            if (strlen(longest) > strlen(sx))
                strcpy(sx, longest);
        }
        printf("The longest is: %s\n", sx);  // ✅ 輸出 sx(始終保存最長)
    }
    return 0;
}

關鍵修正點總結

問題修正
緩衝區殘留 \ngetchar() 或 scanf("%*c") 消耗
循環起始索引首串已讀,循環從 i=1 開始
格式符錯誤%s 對應字符串,%d 對應整數
結果變量混淆統一用 sx 保存最長,最後輸出 sx

工程化輸入函數封裝


bool read_string(char* buf, size_t size) {
    if (!fgets(buf, size, stdin)) return false;
    buf[strcspn(buf, "\n")] = '\0';  // 移除換行符
    return true;
}
// 使用:read_string(sx, sizeof(sx));

掌握 scanf 緩衝區特性與 fgets 替代方案,是處理交互式輸入的基本功。

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