C语言 分割错误11当我自己制作strlen时

dsekswqp  于 2023-01-01  发布在  其他
关注(0)|答案(2)|浏览(152)

我尝试自己在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标准库中的strlenunsigned long类型,但我不认为这是Segmentation fault: 11的原因,因为没有出现关于type的错误。

    • 参考资料**

我写了我的代码提到这个链接。

kx1ctssn

kx1ctssn1#

如果要重新实现strlen,则应返回size_t而不是int,并检查str[i] != '\0'而不是str[i] != '\n'
注意以下警告:

warning: this program uses gets(), which is unsafe.

gets不再是标准的一部分,它是不安全的,因为没有办法防止缓冲区溢出。无论如何,gets不包括换行符(这就是为什么它segfault阅读超出数组的限制)。
必须避免使用此函数,并使用fgets(或getline,如果可用):

if (fgets(input, sizeof input, stdin))
{
    input[strcspn(input, "\n")] = '\0'; // Strip the trailing newline
    printf("The length of your string : %zu\n", mystrlen(input));  
}
eagi6jfj

eagi6jfj2#

你的问题是检查新行字符str[i] != '\n'。在C语言中,空终止符\0决定字符串的结束。

int mystrlen(const char* str){
        int i;
        for (i=0; str[i] != '\0'; i++);
        return i;
}

相关问题