【问题标题】:why am I getting "Access violation" writing location?为什么我会收到“访问冲突”的写入位置?
【发布时间】:2022-01-09 17:14:14
【问题描述】:

我正在尝试使用strtok 来获取带有\0 的字符串,而不是用# 替换\0 的空格,因此我使用strtok。但我得到了 - 访问冲突写入位置 在这一行 - char* word = strtok(stringOfNumberSign, delimiters);

char* addNumberSignToString(char* stringOfNumberSign)
{
    int numOfWords = 0;
    char* delimiters = " ";
    char* word = strtok(stringOfNumberSign, delimiters);
    while (word)
    {   
        numOfWords++;
        word = strtok(NULL, delimiters);
    }

    return stringOfNumberSign;
}

int main()

{
    char* stringForNumberSign = "welcome to hello world";
    char* result;
    result = addNumberSignToString(stringForNumberSign);
    printf("%s", result);
}

【问题讨论】:

  • 为什么我们要猜测 stringOfNumberSign 是如何声明和初始化的?

标签: c undefined-behavior c-strings strtok string-literals


【解决方案1】:

函数strtok 更改传递的字符串。

来自 C 标准(7.23.5.8 的 strtok 函数)

4 strtok 函数然后从那里搜索一个字符 包含在当前分隔符字符串中。如果没有这样的字符 发现,当前标记延伸到指向的字符串的末尾 通过 s1,随后对令牌的搜索将返回一个空指针。 如果找到这样的字符,它会被一个空字符覆盖,这会终止当前标记。 strtok 函数保存一个 指向下一个字符的指针,从该字符下一个搜索 令牌将启动。

但是,您不能更改字符串文字。任何更改字符串文字的尝试都会导致未定义的行为。

来自 C 标准(6.4.5 字符串文字)

7 不确定这些数组是否不同,前提是它们的 元素具有适当的值。 如果程序试图 修改这样的数组,行为未定义。

您正在尝试更改字符串文字

char* stringForNumberSign = "welcome to hello world";
//...
result = addNumberSignToString(stringForNumberSign);

至少你应该使用字符数组而不是字符串文字

char stringForNumberSign[] = "welcome to hello world";

注意你的函数没有意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 2020-09-04
    • 2012-12-05
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多