不使用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
相关产品推荐
相关产品推荐

