while(*p != '/0') // 錯誤:字符常量 '/0' 是多字符常量,值實現定義
{
a[i++] = *p;
p++;
}
用戶代碼中混用 `gets_s`、`scanf_s`、`getchar`,極易觸發緩衝區殘留 `\n` 導致 `getchar` 讀到換行符而非預期字符。
char name[20];
int age;
char gender;
printf("Name: "); gets_s(name, 20); // 讀取 "Tom\n",緩衝區剩 '\n'
printf("Age: "); scanf_s("%d", &age); // 讀取 20,緩衝區剩 '\n'
gender = getchar(); // 讀到 '\n',而非 'M'/'F'!
| 方法 | 代碼 | 優點 | 缺點 |
|---|---|---|---|
| 讀取並丟棄 | `getchar();` 在下一個 getchar 前 | 簡單 | 若緩衝區有多字符不夠用 |
| 循環清空 | `while(getchar() != '\n');` | 徹底清空本行 | 若緩衝區已空會阻塞等待輸入 |
| scanf 格式字符串吃掉空白 | `scanf_s(" %c", &gender);` (注意 `%c` 前有空格) | 標準、自動跳過所有空白字符(\n \t 空格) | 僅適用 scanf 族函數 |
| 統一用 fgets + sscanf | `fgets(buf, sizeof(buf), stdin); sscanf(buf, "%d", &age);` | 徹底避免緩衝區殘留,行級讀取可控 | 略繁瑣,需處理末尾 \n |
| fflush(stdin) (非標準) | `fflush(stdin);` (MSVC 支持,GCC 不保證) | 一行代碼 | **C 標準未定義行為**,不可移植,嚴禁用於正規項目 |
// 1. 修正字符串結束符判斷
while(*p != '\0') // 或 while(*p)
{
a[i++] = *p;
p++;
}
// 2. 輸入邏輯建議改用 fgets + sscanf
char line[100];
printf("Enter string: ");
fgets(line, sizeof(line), stdin);
line[strcspn(line, "\n")] = '\0'; // 移除末尾換行符
strcpy(s, line);
// 3. 如果必須用 scanf/getchar,統一風格:
// 讀取整數後清空換行符
int n; scanf_s("%d", &n); while(getchar() != '\n');
// 讀取單字符用帶空格的 scanf
char ch; scanf_s(" %c", &ch); // 自動跳過空白
最佳回答精準指出:`while(*p!='/0') => while(*p!='\\0')`—— 一字千鈞,直擊要害。