0

考虑下面的代码:当我在 mingw 64 下运行时,d->box 等于“jp2”,那么 br 也等于“jp2”。即它是空终止的。所以 strcmp 成功并返回 0。

在 Visual Studio 2012 下,scrncpy 不返回以空字符结尾的字符串。

strcmp 在这种情况下失败。但是,根据 strcmp 文档:

///////////////////////////////////////// ///////////////////

strcmp 比较两个字符串 比较 C 字符串 str1 和 C 字符串 str2。

此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续以下对,直到字符不同或到达终止空字符。

///////////////////////////////////////// /////////////////////

因此,strcmp 应该会成功,即使一个字符串以 null 结尾而一个字符串不是。

关于为什么会这样的任何想法?

    char *br = (char*)malloc(5 * sizeof(char));
br = strncpy(br, (const char*)b->dbox, 4);

if(strcmp(br, "jp2\040")) {
    println(INFO, "DOSEN'T Conform to IS 15444-1. Exiting");
    return 1;
} else
    println(INFO, "Conforms to IS 15444-1");
4

1 回答 1

1

如果源与给定的限制(此处为 4)一样长或更长,则 strncpy() 不会在任一系统上附加 0 字节(即不会终止字符串)。这意味着比较失败,因为——除非碰巧在 br+4 处的内存中有一个 0——否则 br 处的“字符串”比 4 长,因此不同。

修复未知字符串源的良好做法:将缓冲区的最后一个字节硬设置为 0。

br = strncpy(br, (const char*)b->dbox, 4);
br[4] = '\0';
于 2014-03-15T04:37:33.573 回答