我尝试自己在C语言的标准库中创建strlen
,命名为mystrlen
。我添加了其他部分使其运行。我使用vim编辑器编写代码,使用gcc运行代码。代码已成功编译。
#include <stdio.h>
int mystrlen(const char* str){
int i;
for (i=0;str[i]!='\n';i++);
return i;
}
int main(void){
char input[100];
gets(input);
printf("The length of your string : %d\n", mystrlen(input));
return 0;
}
然后,我尝试运行.exe
文件,当我输入abc
时,显示以下内容:
warning: this program uses gets(), which is unsafe.
abc
Segmentation fault: 11
我还测试了其他一些输入字符串,结果是相同的。
当我输入aka
时,Segmentation fault: 11
没有出现,长度显示为104
。
warning: this program uses gets(), which is unsafe.
aka
The length of your string : 104
我在网上搜索了一下Segmentation fault: 11
,但是没有找到类似的情况,好像Segmentation fault: 11
出现的时候内存访问有问题,但是我不确定内存访问失败的地方在哪里,你能告诉我如何改进这段代码,让它和C标准库中的strlen
函数一样工作吗?
在我自己的大量试验中,我发现C标准库中的strlen
是unsigned long
类型,但我不认为这是Segmentation fault: 11
的原因,因为没有出现关于type
的错误。
- 参考资料**
我写了我的代码提到这个链接。
2条答案
按热度按时间kx1ctssn1#
如果要重新实现
strlen
,则应返回size_t
而不是int
,并检查str[i] != '\0'
而不是str[i] != '\n'
注意以下警告:
gets
不再是标准的一部分,它是不安全的,因为没有办法防止缓冲区溢出。无论如何,gets
不包括换行符(这就是为什么它segfault阅读超出数组的限制)。必须避免使用此函数,并使用
fgets
(或getline
,如果可用):eagi6jfj2#
你的问题是检查新行字符
str[i] != '\n'
。在C语言中,空终止符\0
决定字符串的结束。