Программа не принимает вторую строку и выдает результат напрямую - PullRequest
0 голосов
/ 06 августа 2020

Здесь я хочу сравнить две строки в case2. case 1 работает хорошо, но когда я go - case 2, он не запрашивает ввод второй строки и напрямую печатает «Обе строки разные» [1] [1]: https://i.stack.imgur.com/l2J6L.jpg

#include <stdio.h>
#include <stdlib.h>
#define size 20

int main ()
{
    char str1[size],str2[size];
    int operation,error=0,i=0;
    printf("Enter String: ");
    fgets(str1, size, stdin);
    do {
        printf("1.Copy\n2.Compare\n3.Exit\nWhich operation you want to do:");
        scanf("%d",&operation);
        switch (operation) {
            case 1:
                for (int i=0; str1[i] != '\0'; i++) {
                    str2[i] = str1[i];
                }
                printf("First string: %s\n",str1);
                printf("Second string: %s\n",str2);
                break;
            
            default:
                printf("Error");
                break;
        
            case 2:
                printf("Enter second string: ");      // it's not executing (Not takin input) and directly i get o/p of line 39
                fgets(str2, size, stdin);
                for (i=0; str2[i] != '\0'; i++) {
                    if (str1[i] != str2[i]) {
                        error++;
                    }
                }
                if (error == 0) {
                    printf("Both strings are same.\n");
                }
                else
                    printf("Both strings are not same.\n");
                break;
        }
    

    } while (operation != 3);
}

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Поскольку scanf оставляет за собой висящий символ новой строки \n, он заставляет fgets не ждать ввода от пользователя. Попробуйте очистить входной буфер, используя getchar.

Обновление: Добавлено l oop, чтобы удалить все символы, которые пропускаются scanf, но могут быть введены пользователем. например, лишние пробелы после числа.

...
do {
        printf("1.Copy\n2.Compare\n3.Exit\nWhich operation you want to do:");
        scanf("%d",&operation);
        int ch;
        while ((ch = getchar()) != '\n' && ch != EOF);
        switch (operation) {
...

Ссылка: faq.cprogramming.com

0 голосов
/ 06 августа 2020

Поскольку ваши строки являются строками, scanf () не является хорошим выбором, кроме как для получения целочисленного значения, и для очистки буфера от всего после этого (может быть всякого рода мусор, никогда не доверяйте пользователю), выполните fgets в str2. Ваши новые строки тоже будут сравниваться, если они идентичны. Вы также должны проверить, что возврат от scanf равен 1, говоря, что у вас есть число! Что, если пользователь наберет «x» в качестве числа? Если хотите спросить еще раз, вам нужно очистить буфер от мусора. Помните, что, поскольку у вас есть «приготовленный» ввод, ничего не отправляется, пока пользователь не нажмет Enter, поэтому вам всегда нужно иметь дело с символом новой строки. Если все, что вы делаете, это scanf в числах, scanf пройдет через новую строку как пробел, ища di git, но вы вводите смешанные строки и числа.

Вам нужно сравнить null с mis -сравнить, если одна строка является префиксом другой, поэтому в 'for' test 'i

Поскольку конечные пробелы являются частью вашей строки, вы можете напечатать их в одинарных кавычках (после удаления новой строки).

...