YunAn811 2024-04-29 10:31 采纳率: 100%
浏览 1
已结题

函数递归出现问题,请问该怎么解决

今天在写不创建临时变量求字符串长度的题目的时候出现了下面这个问题,先放原代码


```c
int is_my_strlen(char* p)
{
    if (*p != '\0')
    {
         return 1 + is_my_strlen(p + 1);
    }
    else
    {
        return 0;
    }
}
int main()
{
    char arr[] = { 0 };
    scanf("%s", arr);
    int len = is_my_strlen(arr);
    printf("%d", len);
    return 0;
}

运行后,结果倒是没什么问题,但是出现了这个

img

这个问题该怎么解决啊

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-04-29 10:31
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    问题概括

    您在编写一个不使用临时变量来计算字符串长度的函数时,遇到了运行时堆栈损坏的问题。

    问题出现原因

    问题出现的原因是在main函数中,您使用了scanf("%s", arr);来读取字符串,这会导致未初始化的数组元素被读取,进而可能破坏了堆栈。

    问题解决方案

    为了解决这个问题,您需要确保arr数组有足够的空间来存储输入的字符串,并在数组末尾留出一个位置来存储空字符'\0'。同时,您应该使用%99s来限制输入的长度,避免超出数组的界限。

    提供代码

    以下是修改后的代码:

    #include <stdio.h>
    
    int is_my_strlen(char* p) {
        if (*p != '\0') {
            return 1 + is_my_strlen(p + 1);
        } else {
            return 0;
        }
    }
    
    int main() {
        char arr[100]; // 假设输入的字符串不会超过99个字符
        scanf("%99s", arr); // 限制输入长度为99个字符
        int len = is_my_strlen(arr);
        printf("%d", len);
        return 0;
    }
    

    代码运行方式

    1. 将上述代码复制到C语言的编译环境中。
    2. 编译并运行程序。
    3. 输入一个字符串,然后按回车键。

    代码预期运行结果

    如果输入的字符串是"hello",那么程序将输出5,因为"hello"的长度是5。

    推荐相关链接

    请注意,上述链接仅供参考,您可能需要根据实际情况查找更多的资源。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月7日
  • 已采纳回答 4月29日
  • 创建了问题 4月29日