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

不使用strlen()函数求字符串长度却遇Segmentation Fault问题求助

问题分析与修复方案

你的代码出现段错误(Segmentation Fault)主要有两个关键错误,下面逐一说明并修复:

1. 函数调用时的参数错误

在main函数中,你调用string_length(str[100]),这里的str[100]是数组str的第101个元素(数组下标从0开始,str的有效下标范围是0到99),属于数组越界访问;而且你传递的是单个字符,而函数需要的是char[](本质是char*指针)类型的参数,这直接导致非法内存访问,引发段错误。

正确写法是传递数组名str,数组名会自动退化为指向数组首元素的指针:

ausgabe = string_length(str);

2. scanf的参数错误

在string_length函数中,scanf("%s",&str);这里的str已经是指向数组首元素的指针,&str是指向整个数组的指针(类型为char (*)[100]),和%s要求的char*类型不匹配,会导致scanf写入错误的内存地址,同样引发段错误。

正确写法是直接使用str作为scanf的参数:

scanf("%s", str);

额外优化建议

  • 函数职责单一化:string_length的核心功能是计算长度,建议把输入字符串的逻辑放到main函数中,让函数只专注于长度计算,代码结构更清晰。
  • 变量类型统一:string_length返回unsigned类型,ausgabe定义为int,虽然可以兼容,但统一类型能避免潜在问题。

修复后的完整代码

#include <stdio.h>

// 仅负责计算字符串长度的函数
unsigned string_length(char str[])
{
    unsigned i;
    for (i = 0; str[i] != '\0'; ++i)
    {
        // 空循环逻辑正确,无需额外代码
    }
    return i;
}

int main()
{
    unsigned ausgabe;
    char str[100];
    
    printf("Enter a string: ");
    scanf("%s", str);
    
    ausgabe = string_length(str);
    printf("Length of string: %u\n", ausgabe);
    
    return 0;
}

其他循环写法参考(可选)

如果想用while循环实现,逻辑类似:

unsigned string_length(char str[])
{
    unsigned len = 0;
    while (str[len] != '\0')
    {
        len++;
    }
    return len;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:15:19