我正在制作一个简短的程序,它会给我一个名字的首字母,所以如果名字是 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/