我正在编写一个简短的程序,给我一个名字的缩写,所以如果名字是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行的-statement使用未初始化的内存:
==9110== Conditional jump or move depends on uninitialised value(s)
==9110== at 0x4006B1: main (test.c:12)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句