C 語言新手常見錯誤:字串比較與輸入處理
錯誤程式碼重現
char answer; // ❌ 1. 單一 char 非字串
scanf("%s", answer); // ❌ 2. 格式錯誤、緩衝區溢位風險
if (answer = "想") // ❌ 3. 指派而非比較、字串字面值比較位址
printf("相等\n");
三大核心錯誤解析
| 錯誤 | 問題 | 正確做法 |
char answer; | 只能存單一字元,無法存字串 | char answer[100]; 或 char *answer = malloc(100); |
if (answer = "想") | = 是指派,永遠為真 (非空指標);字串比較應用 strcmp | if (strcmp(answer, "想") == 0) |
scanf("%s", answer) 無長度限制 | 輸入超過緩衝區大小導致緩衝區溢位 (Buffer Overflow) | scanf("%99s", answer) 或 fgets(answer, 100, stdin) |
正確完整範例
#include <stdio.h>
#include <string.h>
int myStrcmp(const char* s1, const char* s2) {
while (*s1 && *s2 && *s1 == *s2) {
s1++; s2++;
}
return *s1 - *s2;
}
int main() {
char answer[100];
printf("請輸入: ");
fgets(answer, sizeof(answer), stdin);
// 移除 fgets 讀入的換行符
answer[strcspn(answer, "\n")] = '\0';
if (myStrcmp(answer, "想") == 0) {
printf("兩字串相等\n");
} else {
printf("兩字串不相等\n");
}
return 0;
}
字串比較三種方式對照
| 方式 | 語法 | 適用場景 | 備註 |
| 標準庫 | strcmp(s1, s2) == 0 | 一般比較 | 回傳 0 表相等,<0 s10 s1>s2 (ASCII 碼序) |
| 指定長度 | strncmp(s1, s2, n) == 0 | 比較前 n 字元 | 防止讀越界 |
| 自寫函數 | 如上 myStrcmp | 教學、面試、特殊比較規則 | 理解指標走訪邏輯 |
補充:字串輸入最佳實務
// 方式 1: fgets (推薦,可讀取含空白字串)
char buf[100];
fgets(buf, sizeof(buf), stdin);
buf[strcspn(buf, "\n")] = '\0'; // 移除換行
// 方式 2: scanf 加寬度限制 (不含空白)
scanf("%99s", buf); // 99 = sizeof(buf)-1
// 方式 3: 動態分配 (長度未知)
size_t cap = 100, len = 0;
char *s = malloc(cap);
int ch;
while ((ch = getchar()) != '\n' && ch != EOF) {
if (len + 1 >= cap) {
cap *= 2;
s = realloc(s, cap);
}
s[len++] = ch;
}
s[len] = '\0';