c - C 中的段错误导致代码有时运行但有时不运行

标签 c pointers segmentation-fault

我正在制作一个简短的程序,它会给我一个名字的首字母,所以如果名字是 john smith,它会给我 JS。

我写的代码是:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(void)
{ 
    string name = "String Name Goes here"

    for (int i = 0, n = strlen(name); i < n; i++)
    {
        printf("%c", toupper(name[i]));
        while(name[i] != ' ')
        {
            i++;
        } 
    }
    printf("\n");
}

因此,由于我只使用了通用字符串名称,因此我应该得到的结果是 SNGH。问题是,代码有时能正常工作,有时却出现段错误。当字符串中有大写字母时它总是出现,但是当字符串中没有大写字母时,有时它会输出我想要的。我知道这与访问我不允许访问的内存有关,但我看不到这在这里如何应用,因为我只访问 i 计数器。

发生这种情况的原因是什么?

*编辑:我使用“字符串”的原因是因为我正在访问一个不同的库,我没有在此处列出它定义了一个函数来获取字符串。所以我可以得到正确的字符串,我只是用我以前的代码替换了代码。那不是导致问题的部分。

最佳答案

如评论中所述,如果您正在处理的字符串不以空格字符结尾,则此循环将跳过字符串终止符并在内存中查找name 之外的空格字符。多变的。如果它在到达太远之前找到一个空格字符,程序将成功终止。如果它最终没有找到一个空间,你会得到一个“段错误”错误,因为它试图从一个无效的内存位置读取。

    while(name[i] != ' ')
    {
        i++;
    } 

修复是检查字符串终止符和空格:

    while(name[i] != ' ' && name[i] != '\0')
    {
        i++;
    }

当然,这是假设 string这里实际上是一个 C 字符串:char[]char*

例如,您可以通过运行 valgrind 下的程序自己找到它.您将获得的输出告诉您 while -第 12 行的语句使用未初始化的内存:

==9110== Conditional jump or move depends on uninitialised value(s)
==9110==    at 0x4006B1: main (test.c:12)

关于c - C 中的段错误导致代码有时运行但有时不运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19001205/

相关文章:

c++ - Qt - C++ 字符串连接段错误

c - c 中的段错误 - 可能与指针有关

c - 进行矩阵乘法时 C 中的段错误

iphone - 尝试将 NSUInteger 与枚举一起使用 (<<)

c - 为什么我的节点的 String 成员在创建后会打印一个空行?

c - 递增的错误类型参数

C++ : Two pointers (supposedly) to the same address. 改变其中一个的内容不会改变另一个的内容

c - 读取 C 中文件传输的可执行文件的字符

c - 从另一个文件访问的 C 中的静态变量

c - 如何修改常量字符串?