You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对称数判断函数运行异常求助:所有数字均被判定为对称数

对称数判断函数的问题分析与修复

原代码的核心错误

  • sprintf格式符误用:使用%c会把整数n当作ASCII码值转换为单个字符,而非将整数转为数字字符串。比如n=123时,%c会输出ASCII码123对应的字符({),而非"123",直接导致后续字符串处理完全失效。
  • 循环逻辑彻底错误:原代码在第一次循环迭代中,只要首末字符相等就立即返回true,不等则返回false。这意味着函数只会做一次判断(甚至因格式符错误,字符串长度为1时直接返回true),这就是所有数字都被判定为对称数的根本原因。
  • 循环条件错误:i <= lengh会导致数组越界,且对称数只需比较前半部分与后半部分的对应位置,正确条件应为i < length / 2。
  • 内存泄漏:malloc分配的内存未用free释放,会造成内存泄漏。
  • 变量名不规范:lengh应为length,虽不影响运行,但不符合编码规范。

修复后的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

bool problem30(int n) {
    char* a = (char*)malloc(sizeof(char) * 100);
    if (a == NULL) { // 检查内存分配是否成功
        return false;
    }
    sprintf(a, "%d", n); // 用%d正确将整数转为数字字符串
    int length = strlen(a);
    bool isSymmetric = true;

    // 仅比较前半部分与后半部分的对应字符
    for (int i = 0; i < length / 2; i++) {
        if (a[i] != a[length - i - 1]) {
            isSymmetric = false;
            break; // 发现不相等,直接终止循环
        }
    }

    free(a); // 释放分配的内存
    return isSymmetric;
}

修复说明

  1. 改用%d格式符,确保整数被正确转换为数字字符串,为后续字符比较提供基础。
  2. 先默认数为对称状态,遍历过程中只要发现任意一对对应字符不相等,就标记为非对称并跳出循环,避免无效遍历。
  3. 循环结束后统一返回判断结果,而非在循环内提前返回,保证逻辑完整性。
  4. 添加malloc空指针检查,避免内存分配失败导致程序崩溃。
  5. 用free释放内存,解决内存泄漏问题。

内容的提问来源于stack exchange,提问作者Dinosour

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 11:42:30