自定义 strcmp (C) 中的奇怪错误
Weird bug in custom strcmp (C)
我有一个编写自定义 strcmp 的任务,它将比较两个字符串有点忽略它们中的空格(意思是," a b c"
是 "abc"
)和 return 一些正数,如果 str1>str2
,如果 str2>str1
则为负,如果 str1=str2
则为 0。这是代码
int mystrcmp(const char *str1, const char *str2)
{
while (*str1 != '[=10=]' && *str2 != '[=10=]') {
while ((*str1) == ' ') {
str1++;
}
while ((*str2) == ' ') {
str2++;
}
if (*str1 != *str2 || *str1 == 0 || *str2 == 0) {
return (unsigned char) *str1 - (unsigned char) *str2;
}
str1++;
str2++;
}
return (unsigned char) *str1 - (unsigned char) *str2;
}
问题是它不能与被认为相等的 "ab "
和 "ab"
一起正常工作。那些 while 应该得到 str1
和 str2
指向 '[=20=]'
的指针,然后减去它们和 return 0。相反,它 returns 32,这意味着它没有str1
到 '[=20=]'
。我错过了什么?
外循环继续,而两个指针都没有结束;这不满足于恰好有一个在最后(这意味着它一旦 either 指针在最后就停止)。
只要在您的其中一个字符串中找到“\0”,您的循环就会停止。但另一个字符串可能仍包含 space。当你比较 "ab"
和 "ab ",第二个字符串将永远不会完全迭代其他。您需要确保您的两个字符串都不会以 space 结尾。试试这个修复:
while (*str1 != '[=10=]' && *str2 != '[=10=]') {
while ((*str1) == ' ') {
str1++;
}
while ((*str2) == ' ') {
str2++;
}
if (*str1 != *str2 || *str1 == 0 || *str2 == 0)
break ;
str1++;
str2++;
}
while (*str1 == ' ')
str1++;
while (*str2 == ' ')
str2++;
return (unsigned char) *str1 - (unsigned char) *str2;
共享代码的问题在于,当任何字符串到达“\0”时,外部 while 循环就会中断。试试下面的代码,它确保两个字符串都循环到最后以检查匹配。
int mystrcmp(const char *str1, const char *str2)
{
while (1) {
while ((*str1) == ' ') {
str1++;
}
while ((*str2) == ' ') {
str2++;
}
if (*str1 != *str2 ) {
return (unsigned char) *str1 - (unsigned char) *str2;
}
if ((*str1) != '[=10=]') str1++;
if ((*str2) != '[=10=]') str2++;
if ((*str1) == '[=10=]' && (*str2) == '[=10=]')
{
return 0;
}
}
}
我有一个编写自定义 strcmp 的任务,它将比较两个字符串有点忽略它们中的空格(意思是," a b c"
是 "abc"
)和 return 一些正数,如果 str1>str2
,如果 str2>str1
则为负,如果 str1=str2
则为 0。这是代码
int mystrcmp(const char *str1, const char *str2)
{
while (*str1 != '[=10=]' && *str2 != '[=10=]') {
while ((*str1) == ' ') {
str1++;
}
while ((*str2) == ' ') {
str2++;
}
if (*str1 != *str2 || *str1 == 0 || *str2 == 0) {
return (unsigned char) *str1 - (unsigned char) *str2;
}
str1++;
str2++;
}
return (unsigned char) *str1 - (unsigned char) *str2;
}
问题是它不能与被认为相等的 "ab "
和 "ab"
一起正常工作。那些 while 应该得到 str1
和 str2
指向 '[=20=]'
的指针,然后减去它们和 return 0。相反,它 returns 32,这意味着它没有str1
到 '[=20=]'
。我错过了什么?
外循环继续,而两个指针都没有结束;这不满足于恰好有一个在最后(这意味着它一旦 either 指针在最后就停止)。
只要在您的其中一个字符串中找到“\0”,您的循环就会停止。但另一个字符串可能仍包含 space。当你比较 "ab"
和 "ab ",第二个字符串将永远不会完全迭代其他。您需要确保您的两个字符串都不会以 space 结尾。试试这个修复:
while (*str1 != '[=10=]' && *str2 != '[=10=]') {
while ((*str1) == ' ') {
str1++;
}
while ((*str2) == ' ') {
str2++;
}
if (*str1 != *str2 || *str1 == 0 || *str2 == 0)
break ;
str1++;
str2++;
}
while (*str1 == ' ')
str1++;
while (*str2 == ' ')
str2++;
return (unsigned char) *str1 - (unsigned char) *str2;
共享代码的问题在于,当任何字符串到达“\0”时,外部 while 循环就会中断。试试下面的代码,它确保两个字符串都循环到最后以检查匹配。
int mystrcmp(const char *str1, const char *str2)
{
while (1) {
while ((*str1) == ' ') {
str1++;
}
while ((*str2) == ' ') {
str2++;
}
if (*str1 != *str2 ) {
return (unsigned char) *str1 - (unsigned char) *str2;
}
if ((*str1) != '[=10=]') str1++;
if ((*str2) != '[=10=]') str2++;
if ((*str1) == '[=10=]' && (*str2) == '[=10=]')
{
return 0;
}
}
}