Разница между strcmp из string.h и моей собственной реализацией strcmp - PullRequest
5 голосов
/ 14 июня 2019

Первый printf дает вывод как -1, тогда как второй printf дает вывод как -115.

#include<stdio.h>
#include<string.h>
int mystrcmp(char*s, char*t){
    for(;*s==*t;s++,t++){
        if(*s=='\0'){
            return 0;
        }
    }
    return (*s-*t);
}
int main()
{
    char *y,*x="this";
    y="thiss";
    printf("%d\n\n",strcmp(x,y));
    printf("%d",mystrcmp(x,y));
    return 0;
}

Я понимаю, что в моей реализации код вычисляет 0 (ASCII of Null) -'s' (значение ASCII 115).Может кто-нибудь, пожалуйста, помогите мне, как я могу точно дублировать работу функции strcmp, которая находится в string.h

Ответы [ 3 ]

10 голосов
/ 14 июня 2019

Точные значения, возвращаемые из strcmp в неравных случаях, не определены явно.В вашем конкретном случае любое отрицательное значение считается действительным.Из справочной страницы :

Функции strcmp () и strncmp () возвращают целое число меньше, равно или больше нуля, если s1 (или первые n байтов)его), соответственно, меньше или равно s2.

Таким образом, единственной гарантией является то, что если первый аргумент "меньше" второго, то результатотрицательно, и если первое «больше» второго, то результат положительный.Разные реализации могут возвращать разные значения для одних и тех же строк.

Например, если я компилирую и запускаю ваш код на моей машине с оптимизацией, установленной на -O0, я получаю -115 от strcmp.Если я изменяю оптимизацию на -O1, она возвращает -1 вместо.Таким образом, результат может не только меняться с одного компьютера на другой, но даже может отличаться на одном компьютере с различными настройками компилятора.

2 голосов
/ 14 июня 2019

Реализация "реального" strcmp на вашей платформе, скорее всего, близка к этому коду:

int strcmp(const char *s, const char *t) {
    for(; *s == *t; s++, t++) {
        if (*s == '\0') {           // are we at the end ?
            return 0;               // yes
        }
    }
    return (*s-*t) > 0 ? 1 : -1;   // return either +1 or -1
}

Кстати: оно должно быть int strcmp(const char *s, const char *t) вместо int strcmp(char *s, char *t)

0 голосов
/ 14 июня 2019

На странице manuel сказано, что функция strcmp () сравнивает две строки s1 и s2.Он возвращает целое число, меньшее, равное или большее нуля, если найдено, что s1 соответственно меньше, соответствует или больше s2.Вы можете попробовать этот код:

    int ft_strcmp(const char *s1, const char *s2)
{
    while ((unsigned char)*s1 || (unsigned char)*s2)
    {
        if ((unsigned char)*s1 != (unsigned char)*s2)
            return ((unsigned char)*s1 - (unsigned char)*s2);
        s1++;
        s2++;
    }
    return (0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...