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

C語言字串比較錯誤分析:指標、陣列、strcmp 正確用法

     編輯:C 語言問答

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 = "想")= 是指派,永遠為真 (非空指標);字串比較應用 strcmpif (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';
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved