Вставка простой распечатки даст вам хорошую подсказку.Сделайте так:
if(str[i]=='\n')
{
printf("Read the string: %s\n", str);
break;
}
Когда я запускаю этот код, я получаю это:
$ ./a.out
Mata in en sträng: asdf
Read the string: asdf
Strängen är inte ett palindrom
Vill du köra igen? j/n: j
Mata in en sträng: Read the string:
sdf
Strängen är inte ett palindrom
Vill du köra igen? j/n: j
Mata in en sträng: Read the string:
df
Strängen är inte ett palindrom
Vill du köra igen? j/n: j
Mata in en sträng: Read the string:
f
Strängen är inte ett palindrom
Vill du köra igen? j/n: j
Mata in en sträng: Read the string:
Strängen är inte ett palindrom
Vill du köra igen? j/n: j
Mata in en sträng: Read the string:
Strängen är inte ett palindrom
Vill du köra igen? j/n:
Проблема в том, что входной буфер не очищен.Хороший способ обойти это - использовать fgets
вместо scanf
.scanf
полезно, когда у вас есть данные в четко определенном формате, а пользовательский ввод - нет, поскольку пользователи делают ошибки.Пользовательский ввод обычно лучше всего обрабатывать, сначала читая его в строку, а затем анализируя.Вот способ заставить его работать:
int main(void)
{
char str[1000];
do {
printf("Mata in en sträng: ");
int i = 0;
if(fgets(str, 100, stdin) == NULL) {
// Handle this error
}
delete_spaces(str);
convert_to_lower(str);
int palindrom_or_nah = is_palindrome(str);
if(palindrom_or_nah == 1)
printf("\nSträngen är ett palindrom\n\n");
else
printf("\nSträngen är inte ett palindrom\n\n");
printf("Vill du köra igen? j/n: ");
if(fgets(str, 100, stdin) == NULL) {
// Handle error
}
} while(str[0] == 'j');
return 0;
}
И помните, что для scanf
и fgets
вы должны ВСЕГДА проверять возвращаемое значение на наличие ошибок.