[英]Strcmp() function realization on C
我需要自己创建一个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;
}
但我的导师告诉我,我的代码中存在小错误。 我花了很多时间进行测试,但找不到它。
这回答了你做错了什么的问题吗?
#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()
的返回值应为:
如果返回值<0则表示str1小于str2。
如果返回值> 0则表示str2小于str1。
如果返回值= 0则表示str1等于str2。
而你正好相反。
@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
处理所需的无符号比较。 (见下面关于无符号比较。)
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 )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.