Программа Palindrome, которая позволяет пользователю выбрать, хотите ли вы выполнить код снова или нет с помощью do while - PullRequest
0 голосов
/ 01 октября 2018

Для школьного задания мне нужно создать программу, которая позволяет пользователю вводить строку, которая должна храниться в массиве.Затем программа вызывает функцию, которая удаляет все пробелы в массиве.После этого вызовите функцию, которая делает все буквы строчными.После этого вызовите третью функцию, которая проверяет, является ли текущий массив палиндромом, и возвращает 1, если он есть, и 0, если нет.Программа работает отлично.Но после того, как я применил do к коду, который позволяет вам вводить массив и вызывать функции, он, кажется, пропускает scanf, который принимает входные данные в массив, в основном программа не позволяет мне вводить еще одну строку для хранения в массивечтобы проверить, если это палиндром.В настоящее время я удалил do в моем коде, но он должен быть реализован, кто-то может мне помочь?

int is_palindrome(char input_string[]);
void delete_spaces(char input_string[]);
void convert_to_lower(char input_string[]);

int main(void)
{
    char str[1000];
    char again;

    do {
        printf("Mata in en sträng: ");

        int i = 0;
        for (i = 0; i < 100; i++)
        {
            scanf("%c", &str[i]);
            if(str[i]=='\n')
            {
                break;
            }
        }

        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: ");
            scanf(" %c", &again);
    }while(again == 'j');
    return 0;
}

//Kolla ifall strängen är ett palindrom
int is_palindrome(char input_string[])
{
    int answer = 0, i = 0;
    int h = (unsigned)strlen(input_string)-1;

    while(h>1)
    {
        if(input_string[i++] != input_string[h--])
        {
            break;
        }
        else
        {
            answer = 1;
        }
    }
    return answer;
}

//Ta bort mellanslag och andra tecken i strängen
void delete_spaces(char input_string[])
{
    int i = 0, j = 0;
    char rem_space[strlen(input_string)];

    while(input_string[i] != '\0')
    {
        if(input_string[i] != ' ')
        {
            if(isalpha(input_string[i]))
            {
                rem_space[j++] = input_string[i];
            }
        }
        i++;
    }
    rem_space[j] = '\0';

    for(i = 0; i < strlen(input_string); i++)
    {
        input_string[i] = rem_space[i];
    }

}

//Gör alla bokstäver till små bokstäver
void convert_to_lower(char input_string[])
{
    int count = (unsigned)strlen(input_string), i;

    for (i = 0; i < count; i++)
    {
        input_string[i] = tolower(input_string[i]);
    }
}

1 Ответ

0 голосов
/ 01 октября 2018

Вставка простой распечатки даст вам хорошую подсказку.Сделайте так:

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 вы должны ВСЕГДА проверять возвращаемое значение на наличие ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...