我需要自己创建一个strcmp函数,使用指针操作。这就是我得到的:
int mystrcmp(const char *str1, const char *str2) {
while ('\0' != *str1 && *str1 == *str2) {
str1 += 1;
str2++;
}
int result1 = (uint8_t)(*str2) - (uint8_t)(*str1); // I need (uint8_t) to use it with Russian symbols.
return result1;
}
但我的导师告诉我,我的代码中存在小错误。我花了很多时间进行测试,但无法找到它。
答案 0 :(得分:9)
这是否回答了你做错的问题?
#include <stdio.h>
#include <stdint.h>
#include <string.h>
int mystrcmp(const char *str1, const char *str2);
int main(void)
{
char* javascript = "JavaScript";
char* java = "Java";
printf("%d\n", mystrcmp(javascript, java));
printf("%d\n", strcmp(javascript, java));
return 0;
}
int mystrcmp(const char *str1, const char *str2) {
while ('\0' != *str1 && *str1 == *str2) {
str1 += 1;
str2++;
}
int result1 = (uint8_t)(*str2) - (uint8_t)(*str1); // I need (uint8_t) to use it with Russian symbols.
return result1;
}
输出:
-83
83
我建议快速修复:
更改
int result1 = (uint8_t)(*str2) - (uint8_t)(*str1);
到
int result1 = (uint8_t)(*str1) - (uint8_t)(*str2);
为什么你错了:
strcmp()
的返回值应为:
如果返回值&lt; 0然后它表示str1小于str2。
如果返回值&gt; 0然后它表示str2小于str1。
如果返回值= 0则表示str1等于str2。
而你正好相反。
答案 1 :(得分:5)
@yLaguardia很好地回答了订单问题。
int strcmp(const char *s1, const char *s2);
strcmp
函数返回一个大于,等于或小于零的整数,因为s1
指向的字符串大于,等于或小于指向的字符串按s2
。 C11dr§7.24.4.23
对于绝大多数情况,使用uint8_t
都可以。稀有机器不使用8位char
,因此uint8_t
不可用。在任何情况下,都不需要它,因为unsigned char
处理所需的 unsigned 比较。 (见下文关于无符号比较。)
int result1 =
((unsigned char)*str1 - (unsigned char)*str2);
更高的可移植代码会使用以下内容来处理char
范围和unsigned
范围匹配以及所有其他char, unsigned char, int, unsigned
尺寸/范围。
int result1 =
((unsigned char)*str1 > (unsigned char)*str2) -
((unsigned char)*str1 < (unsigned char)*str2);
strcmp()
定义为将每个字符视为unsigned char
,无论char
是签名还是未签名。
......每个字符都应被解释为具有类型
unsigned char
......C11§7.24.13
char
是否为ASCII与strcmp()
的编码无关。当然,在不同的字符编码下,可能会出现不同的结果。示例:strcmp("A", "a")
可能会对一个编码产生肯定答案(很少使用EBCDIC),但在另一个编码上产生否定(ASCII)。