使用strncpy复制字符串时遇到异常

时间:2016-05-10 12:13:06

标签: c pointers exception strncpy

我有一个字符串,我正在迭代寻找一个特定的单词,恰好在两个空格之间。

例如:

// where the word that I'm looking for is /docs/index.html
const char* c = "GET /docs/index.html HTTP/1.1\r\n";

我发现这个词如下;

const char* wbeg = strchr(c, ' ') + 1; // points to '/'
const char* wend = strchr(wbeg, ' ') -1; // points to 'l'

如果我想将该单词存储到我使用strncpy

实现的其他位置
char word[256];
strncpy(word, wbeg, wend - wbeg);

我收到以下错误

  

在0x00007FFAAE8C4A74(ucrtbased.dll)中抛出异常   ConsoleApplication1.exe:0xC0000005:访问冲突写入位置   0x0000000000000000。

2 个答案:

答案 0 :(得分:1)

strncpy是一个糟糕的功能。如果source长于count参数,它不能正确终止字符串:

char s[] = "AAAAA";
strncpy(s, "BB", 2);
// s is now "BBAAA", not "BB"

复制后需要显式终止字符串。

char word[SIZE];
ptrdiff_t count = wend - wbeg + 1;
if(count < SIZE) {
    memcpy(word, wbeg, count); // might as well use memcpy
    word[count] = '\0';
}
else // handle error

答案 1 :(得分:1)

当您在帖子中显示的基本要素在简单的main()计划中运行时,...

int main()
{
    const char* c = "GET /docs/index.html HTTP/1.1\r\n";
    const char* wbeg = strchr(c, ' ') + 1; // points to '/'
    const char* wend = strchr(wbeg, ' ') -1; // points to 'l'
    char word[256];
    strncpy(word, wbeg, wend - wbeg);

    printf("%s", word);

    return 0;
}

......在我的环境中没有发现任何故障。因此,除了发布其余相关代码之外,唯一的建议是确保您不会调用 UB

1)在你的陈述中:

strncpy(word, wbeg, wend - wbeg);

`wend - wbeg` is == 15

/docs/index.html长16个字符 将您的陈述更改为:

strncpy(word, wbeg, (wend - wbeg)+1);

2)从初始化变量开始:

  char word[SIZE] = ""  

3)strncpy没有NULL终止。如果要复制的目标在使用之前尚未初始化,或者在使用后未显式为null终止,则可能会发生 UB 。 例如:

char target[];  //contents of target are not guaranteed
char source[]="abcdefghijklmnopqrstuv";
strncpy(target, source, 3);

可以获得以下结果:

|a|b|c|?|?|?|?|?|?|?|?|?|?|?|?|?|...

在哪里?可以是任何东西。

如果要保证ASCII NUL字节位于复制字节的末尾,可以使用以下命令:

strncpy (target, source, 3);
target[3] = 0;
|a|b|c|\0|?|?|?|?|?|?|?|?|?|?|?|?|...

4)如果在两个重叠的对象之间进行复制,则行为未定义。在strchr()

中使用结果之前,请务必检查strncpy()函数的结果