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

CS50 Pset3字符串转int递归代码遇段错误及调用问题求助

问题分析与修复方案

你的代码存在几个关键错误,直接导致了段错误和递归逻辑失效,下面逐一拆解并修正:

核心错误点

  1. 字符串指针被错误转换为数值
    你写的int number = (long) input;是把字符串的内存地址强制转成了整数,完全不是你想要的字符串对应的数字值。后续的number % 10、number - temporary /10都是在操作内存地址,逻辑完全错误。

  2. 递归终止条件无效
    strcmp(input, "\0")的判断逻辑不对,"\0"是一个指向单独空字符的字符串,而你的输入是用户输入的非空字符串,且递归中从未修改input指针,导致这个条件永远无法触发,递归无限运行最终栈溢出,引发段错误。

  3. 递归调用未推进处理进度
    每次递归调用convert(input)都传入同一个指针,没有处理字符串的下一部分,同样导致无限递归。

正确的递归实现思路

递归转字符串为整数的核心逻辑应该是:

  • 终止条件:当字符串为空(*input == '\0')时返回0
  • 递归步骤:取字符串的最后一个字符转成数字,然后递归处理去掉最后一个字符的子串,最终结果为递归结果 * 10 + 当前字符对应的数字;或者反过来处理第一个字符,两种方式都可行。

修正后的完整代码

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

int convert(string input);

int main(void)
{
    string input = get_string("Enter a positive integer: ");

    for (int i = 0, n = strlen(input); i < n; i++)
    {
        if (!isdigit(input[i]))
        {
            printf("Invalid Input!\n");
            return 1;
        }
    }

    printf("%i\n", convert(input));
}

int convert(string input)
{
    // 终止条件:空字符串返回0
    if (*input == '\0')
    {
        return 0;
    }

    // 获取字符串长度,定位最后一个字符
    int len = strlen(input);
    char last_char = input[len - 1];
    // 字符转数字:ASCII码中'0'-'9'连续,减去'0'得到对应整数
    int last_digit = last_char - '0';

    // 把最后一个字符替换为'\0',生成新的子串(注意:这里修改了原字符串,若要保留原串可以复制)
    input[len - 1] = '\0';

    // 递归处理子串,结果 = 子串转换值 *10 + 当前最后一位数字
    int sub_result = convert(input);
    // 恢复原字符串(可选,如果你需要在main中继续使用原输入的话)
    input[len - 1] = last_char;

    return sub_result * 10 + last_digit;
}

代码说明

  • 字符转数字:利用ASCII码特性,'5' - '0'会得到整数5,这是字符串转数字的标准操作,不需要用atoi。
  • 递归推进:通过把最后一个字符设为'\0',让下一次递归处理的是原字符串去掉最后一位的子串,确保每次递归都在缩小问题规模。
  • 终止条件直接检查*input == '\0',当子串为空时停止递归,返回0作为基数。

关于递归函数的调用

在你的main函数中,调用convert(input)的方式是对的,只需要传入用户输入的合法数字字符串即可。修正后的代码会正确递归处理每一位字符,最终返回对应的整数。

内容的提问来源于stack exchange,提问作者Abdelrhman T.Mohamed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 16:35:06