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

POJ 字符統計題目:C 語言 scanf 後緩衝區殘留換行符導致 WA 修正

     編輯:程式設計綜合問答

題目要求

統計字符串中出現次數最多的小寫字母,若並列則輸出 ASCII 碼最小者。輸入多組測試數據,每行長度 ≤ 1000。

原代碼核心缺陷

scanf("%d", &t);
for(g=1; g<=t+1; g++) {  // 循環次數多一次
    // ... 
    ch=getchar();        // 首次讀取殘留的 '\n'
    // ...
}

關鍵問題:scanf("%d") 讀取整數後,緩衝區殘留換行符 \n,導致首次 getchar() 讀到空行,統計邏輯錯位。

修正版代碼

#include 
int main(void) {
    int count[27] = {0}, t, g, i, idx, max;
    char ch;
    scanf("%d", &t);
    getchar();  // 關鍵:吞掉 scanf 留下的換行符
    for(g=1; g<=t; g++) {  // 修正循環次數
        for(i=1; i<=26; i++) count[i]=0;
        for(i=1; i<=1000; i++) {
            ch=getchar();
            if(ch=='\n') break;
            idx = ch - 'a' + 1;
            count[idx]++;
        }
        max = -1;
        for(i=1; i<=26; i++)
            if(count[i] > max) { max = count[i]; idx = i; }
        printf("%c %d\n", 'a' + idx - 1, max);
    }
    return 0;
}

C 輸入緩衝區核心知識點

  • scanf("%d") 讀數字後,緩衝區留 \n
  • 後續 getchar()/scanf("%c") 會讀到此 \n
  • 解決:getchar() 吞掉、或 scanf(" %c") 前加空格跳過空白
  • fflush(stdin) 非標準,不推薦移植代碼使用

代碼風格建議

變量命名見名知義:z[] → count[]、t → caseNum、xia → maxIdx,提升可讀性與維護性。

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