繁体   English   中英

C上的Strcmp()函数实现

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM