輸入 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
// ...
}
}
scanf("%d", &n) 讀取整數後,**換行符 \n 留在緩衝區**scanf("%s", sx) 遇到 \n 視為空白,**跳過並等待下一輸入**,導致首字符串實際讀取的是第二行i=0 重複處理首字符串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;
}
| 問題 | 修正 |
|---|---|
| 緩衝區殘留 \n | getchar() 或 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 替代方案,是處理交互式輸入的基本功。