C字符串裁剪运行时错误

时间:2015-11-22 20:49:23

标签: c pointers char

我希望有一个函数可以返回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."));

2 个答案:

答案 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, ' ')的检查。

更新:尝试更改字符串文字是未定义的行为。