это моя реализация STRCMP,Я не понимаю STRCMP результаты
#include <stdio.h>
#include <string.h>
int ft_strcmp(const char *s1, const char *s2)
{
while (*s1 == *s2)
{
if (*s1 == '\0')
return (0);
s1++;
s2++;
}
return (*s1 - *s2);
}
int main()
{
char s1[100] = "bon";
char s2[100] = "BONN";
char str1[100] = "bon";
char str2[100] = "n";
printf("%d\n", ft_strcmp(s1, s2));
printf("%d\n", ft_strcmp(str1, str2));
return (0);
}
из книги Керниган и Ритчи, но я использую время цикла, вместо для, я Ve проверил это много раз и мой STRCMP выдает те же результаты, что и исходный strcmp, , но я не понимаю результатов, я поехал на мужчину: «Функции strcmp() и strncmp() лексикографически сравнивают строки s1 и s2 с нулевым завершением». Что означает лексикография? «вернуть целое число больше, равное или меньше 0, в соответствии с тем, что строка s1 больше, равна или меньше строки s2». я понимаю эту часть, но мои вопросы, как это можно придумать с такими результатами:
32
-12
< s1 выглядит s2 для меня так, как и почему я получаю 32 и как Расчитать производится? str1 выглядит> str2 для меня, как и почему я получаю -12 и как производится вычисление. Я скомпилирую его с помощью реального STRCMP, и я получаю те же результаты.
последний вопрос, почему мне нужно сравнивать * s1 to '\ 0' не будет работать нормально?
спасибо за ваши ответы я запутался ..
Это не совсем эквивалентно стандартной функции 'strcmp'. Он может выйти из строя, если любая строка содержит символы с отрицательными значениями. Это может произойти только в том случае, если подписан знак «char», который обычно используется. Цитируя стандарт: «Знак отличного от нуля значения, возвращаемого функциями сравнения« memcmp »,« strcmp », и« strncmp », определяется знаком разницы между значениями первой пары символов (оба интерпретируются как 'unsigned char'), которые отличаются по сравнению с объектами ." –
В нескольких ответах упоминается ASCII. Это набор символов с одной кодировкой. Набор символов отображает символ в число. Кодировка отображает число в байты (байты). Вероятно, вы не используете ASCII (и никогда не будете). Windows-1252 (и аналогичные) и Unicode/UTF-8 гораздо более распространены. Важно знать, какой набор символов и кодировка вы используете. Номер символа определит лексикографическое упорядочение. Алгоритм должен иметь дело с кодировкой. Лексикографическое упорядочение является самым простым. Обычно упорядочение задается путем сопоставления, которое может быть связано с языковым стандартом или культурой. –