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

C語言判斷回文數/字符串:指針雙指針法與函數封裝最佳實踐

     編輯:C 語言問答

原代碼錯誤分析

char a[50];
int *m, i, j;
gets(a);           // 危險!gets 不檢查邊界,C11 已移除
m = a;             // 錯誤:int* 指向 char 數組,類型不匹配
for (i=0, j=strlen(a)-1; i

核心問題:int* m 導致指針算術錯誤(按 4 字節步進),gets 不安全,Yes 打印位置錯誤。

標準庫安全版(推薦)

#include <stdio.h>
#include <string.h>
#include <ctype.h>

bool is_palindrome(const char* s) {
    const char *l = s, *r = s + strlen(s) - 1;
    while (l < r) {
        if (!isalnum(*l)) { l++; continue; }  // 跳過非字母數字
        if (!isalnum(*r)) { r--; continue; }
        if (tolower(*l) != tolower(*r)) return false;
        l++; r--;
    }
    return true;
}

int main() {
    char buf[1024];
    if (fgets(buf, sizeof(buf), stdin)) {
        buf[strcspn(buf, "\n")] = '\0';  // 去除換行
        puts(is_palindrome(buf) ? "Yes" : "No");
    }
    return 0;
}

指針雙指針核心邏輯圖解

字符串:  1  2  3  2  1
索引:    0  1  2  3  4
         ↑           ↑
         l           r
比較 *l == *r → 移動 l++, r-- → 相遇/交叉停止

函數封裝規範(作業要求:數組名作實參,指針作形參)

// 形參用 const char* 防止誤修改,返回 int 兼容 C89
int check_palindrome(const char* str) {
    const char *left = str, *right = str + strlen(str) - 1;
    while (left < right) {
        if (*left != *right) return 0;
        left++; right--;
    }
    return 1;
}

// 調用
char input[100];
fgets(input, sizeof(input), stdin);
input[strcspn(input, "\n")] = '\0';
printf("%s\n", check_palindrome(input) ? "Yes" : "No");

避坑清單

  • ❌ 使用 gets / scanf("%s") 無長度限制;
  • ❌ 指針類型不匹配(int* 訪問 char[]);
  • ❌ 忽略大小寫、非字母數字字符(視題目要求);
  • ✅ 用 fgets + 去換行;
  • ✅ 形參加 const;
  • ✅ 邊界條件:空串、單字符視為回文。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved