Итак, вы забыли написать return
в функции lowercase
и не ставили break;
после result = 0;
, и код должен работать нормально.
Пояснение:
В вашем коде есть только одно место, которое печатает Hello
, поэтому мы знаем, что выражение printf("Hello\n")
выполняется в каждом цикле. Это означает, что оператор if
, расположенный непосредственно над этим выражением, каждый раз оценивается в true
, что может произойти, только если функция compstr()
всегда возвращает 1
независимо от того, что является input
. Теперь давайте погрузимся в функцию compstr()
и посмотрим, откуда взялся 1
.
Ну, переменная result
установлена в 1
, если lowercase(str1[i])
равно lowercase(str2[i])
. Итак, наша проблема в том, что lowercase(str1[i])
всегда совпадает с lowercase(str2[i])
. Проверьте вашу lowercase()
функцию. Вы вообще не написали никакого оператора возврата в функции, и поэтому он всегда будет возвращать число мусора независимо от того, что является c
. По сути, все, что вам нужно сделать, это изменить c + 0x20;
на return c + 0x20;
и c;
на return c;
. Вот и все. Очень простая ошибка.
Теперь гораздо большая проблема в том, что у вас нет оператора break после назначения result = 0;
в функции compstr()
следующим образом:
...
else{
result = 0;
break;
}
...
Почему этот перерыв важен? Ну, это актуально только тогда, когда str1
длиннее str2
. Видите, условие завершения вашего цикла for
включает только str1
, поэтому даже когда мы достигаем последнего символа в str2
, мы все равно продолжаем цикл, если str1
длиннее str2
. Давайте посмотрим на пример сценария. Запустим программу и наберем Hello
. Программа сохраняет Hello
в input
, например, input = {'H', 'e', 'l', 'l', 'o', '\0', ...}
, а затем проверяет первое условие ввода с помощью compstr()
и печатает Hello
. Теперь наберите Bye
. Теперь массив input
равен {'B', 'y', 'e', '\0', 'o', '\0', ...}
. Заметьте, как o
из Hello
все еще там? Цикл for
в compstr
установит result
в 0
при первом сравнении символов, что нормально, но без перерыва, он будет продолжать цикл даже после сравнения последнего e
в Bye
, потому что вы сравниваем его с Hello
, который имеет 5 символов, а не 3. В последнем цикле ваш оператор if
будет сравнивать 5-й символ Hello
и 5-й символ Bye
, что является буквой o
для и то и другое. и поэтому result
устанавливается в 1
в конце цикла, и поэтому функция compstr
возвращает 1
, а затем программа печатает Hello
вместо Bye
, даже если вы набрали Bye
, потому что Bye
короче Hello
. Попробуйте, How are you?
, и он будет печатать I am fine
в обычном режиме, но теперь, если вы наберете Hello
или Bye
, вы все равно получите I am fine
, потому что input
выглядит так: 'H', 'e', 'l', 'l', 'o', '\0', 'e', ' ', 'y', 'o', 'u', '?', '\0' ...
. e you?
в конце является значением мусора от нескольких шагов назад, когда мы сохранили How are you?
в той же самой переменной input
.