我希望有一个函数可以返回k
- 来自字符串str
的单词。
char* word_at(int k, char* str)
{
char *p;
for (p = str; *p != '.'; p++)
{
if (k == 0)
{
char *end_of_word;
end_of_word = strchr(p, ' ');
*end_of_word = '\0';
return p;
}
if (*p == ' ')
k--;
}
}
所以我想在第k个单词之后裁剪字符串并将指针返回到该单词的开头。
问题是我无法将'\0'
放到str
。
Visual Studio 2015和2012向我发出访问冲突异常。
有人能帮助我吗?
UPD
我尝试使用正确的输入数据运行它:
printf("%s\n", word_at(2, "The quick brown fox jumped over a lazy dog."));
答案 0 :(得分:2)
此功能有多个问题:
您认为单词后面有空格,请勿检查end_of_word
是否为NULL
。在这种情况下,*end_of_word = '\0';
可能会触发违规行为。
您永远循环测试'.'
。如果您读过字符串的末尾,则可以取消引用无效地址,从而触发违规。
如果您将字符串文字传递给此函数,修改它也可能会触发违规。
答案 1 :(得分:1)
您没有检查字符串的结尾(并尝试在缓冲区后读取):for (p = str; *p != '.'; p++)
尝试读取直到找到一个点,但不检查“字符串”的结尾。同样strchr(p, ' ')
可以返回NULL
,表示从p
开始的字符串中没有空格。
尝试for (p = str; *p != '\0' && *p != '.'; p++)
并在NULL
之后添加一项不取消引用strchr(p, ' ')
的检查。
更新:尝试更改字符串文字是未定义的行为。