C上的Strcmp()函数实现

时间:2016-12-08 19:02:53

标签: 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;
}

但我的导师告诉我,我的代码中存在小错误。我花了很多时间进行测试,但无法找到它。

2 个答案:

答案 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)。