我正在做一个小项目,我无法访问任何 C 标准库。(从头开始在 ARM 结构中构建微内核。甚至 printf 也必须实现)
在这种情况下,我使用 Duff 的机器方法实现了 strcmp。
以下是整个代码。
int
strcmp ( const char *str1, const char *str2 )
{
while ( *str1 || *str2 )
if ( *(str1++) != *(str2++) ) return *str1 - *str2;
return 0;
}
这是有道理的;有一段时间它似乎在测试用例上工作,直到最终系统发生故障。我追查到了这个strcmp。
起初我认为它首先增加了 str1 然后在 str2 增加之前与 str2 进行比较。1. 事实证明不是,但任何人都可以验证它在某些情况下会发生吗?
然后我发现问题出在 *str1 - *str2 中,因此将其更改为返回 1。即,生成的代码如下:
while ( *str1 || *str2 )
if ( *(str1++) != *(str2++) ) return 1;
return 0;
虽然我想要的只是一个“等于”检查,所以改成“1”没有问题,但我仍然想知道为什么原始代码会失败。2. 有人可以就它是如何失败的给出一个提示或建议吗?我宁愿希望 strcmp 遵循标准 C 接口,它返回一个非零值,该值告诉更多关于 str1 和 str2 的信息。
测试用例是:
code_t // a function pointer type
program_find ( char *program )
{
if (strcmp( program, "exit" ) == 0) return ....
else if (strcmp( program, "k1" ) == 0) return ....
else if (strcmp( program, "k3" ) == 0) return ....
else if (strcmp( program, "perf" ) == 0) return ....
else if (strcmp( program, "test_libc" ) == 0) return ....
}
当 *program 为“k3”时,它返回“k1”,而“test_libc”返回“perf”。
原来的问题是通过给它“return 1”来解决的,所以这个问题纯粹是为了C的利益。也欢迎提出建议或链接到 strcmp 文档。我看过 IEEE 的规范接口