Jac*_*Kim 0 c pointers character c-strings strcmp
我正在开发一个小项目,我无法访问任何C标准库.(从头开始构建一个ARM结构的微内核.甚至必须实现printf)
在这种情况下,我使用Duff的机器方法实现了strcmp.
以下是整个代码.
int
strcmp ( const char *str1, const char *str2 )
{
while ( *str1 || *str2 )
if ( *(str1++) != *(str2++) ) return *str1 - *str2;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是有道理的; 有些时候它似乎适用于测试用例,直到最终系统发生故障.我追查到了这个strcmp.
起初我以为它首先递增str1然后比较str2 BEFORE str2递增.事实证明不是,但有人可以确认在某些情况下会发生这种情况吗?
然后我发现问题出现在*str1 - *str2中,所以将其更改为返回1.即,结果代码如下:
while ( *str1 || *str2 )
if ( *(str1++) != *(str2++) ) return 1;
return 0;
Run Code Online (Sandbox Code Playgroud)
虽然我想要的只是一个'等于'检查,所以改成'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 ....
}
Run Code Online (Sandbox Code Playgroud)
当*program为"k3"时,它返回"k1","test_libc"返回"perf".
原来的问题是通过给它"返回1"来解决的,所以这个问题纯粹是为了C利益.建议或链接到strcmp文档也是受欢迎的.我见过IEEE的spec接口
在进行比较时,您在str1和str2上使用了后增量.这会导致它们在进行减法之前递增,因此您将减去错误的两个字符.
一个更好的实施将是
int
strcmp ( const char *str1, const char *str2 )
{
while ( *str1 || *str2 ) {
if ( *str1 != *str2 ) return *str1 - *str2;
++str1;
++str2;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)