получение строки с пробелами из ввода в случае переключателя или цикла - PullRequest
0 голосов
/ 02 мая 2018

Я пробую этот код, который я нашел на этом веб-сайте ( как вы можете разрешить ввод пробелов при использовании scanf )

           char name[15];         //or char*name=malloc(15);
           /* Ask user for name. */

            printf("What is your name? ");

            /* Get the name, with size limit. */

            fgets(name, MAX, stdin);

            /* Remove trailing newline, if there. */

            if ((strlen(name) > 0) && (name[strlen(name) - 1] == '\n'))
                name[strlen(name) - 1] = '\0';

            /* Say hello. */

            printf("Hello %s. Nice to meet you.\n", name);

Когда я запускаю этот код в основном, он работает довольно хорошо. Выход:

 What is your name? j k rowling
Hello j k rowling. Nice to meet you.

Но когда я помещаю этот код в цикл while или в случай переключения:

        char name[15];
        switch (choice) {
            case 1:
            printf("What is your name? ");

            /* Get the name, with size limit. */

            fgets(name, MAX, stdin);

            /* Remove trailing newline, if there. */

            if ((strlen(name) > 0) && (name[strlen(name) - 1] == '\n'))
                name[strlen(name) - 1] = '\0';

            /* Say hello. */

            printf("Hello %s. Nice to meet you.\n", name);


            break;  }

Вывод:

What is your name? Hello . Nice to meet you.

Итак, не нужно ждать ввода строки. может быть, fgets не работает, я не знаю.

Как я могу заставить этот код работать? Или любая альтернатива, чтобы получить строку из ввода со всеми пробелами. Я попробовал это либо:

switch (choice) {
        case 1:
            printf("What is your name? ");
            scanf("%[^\n]s", name);
            printf("%s\n", name);  }

вывод:

What is your name? ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠

Что с ними не так? Я использую визуальную студию. И у меня всегда проблемы. Это об этом?

1 Ответ

0 голосов
/ 02 мая 2018

Проблема в том, что stdin не получает покраснел должным образом.

Вам нужно вручную очистить это. ( fflush () функция доступна. Но это проблематично .)

Ниже приведен пример кода для решения вашей проблемы. Посмотрите здесь работает :

#include <stdio.h>
#define MAX 15

int main(void) {
    // your code goes here
    char name[MAX];
    char c;
    int choice=1;
    while(choice>0 && choice<3)
    {
        printf("Enter your choice: ");
        scanf("%d", &choice);

        switch(choice)
        {
            case 1:

                //Flush stdin
                while ((c = getchar()) == '\n');
                ungetc(c, stdin);

                printf("What is your name? ");
                fgets(name, MAX, stdin);
                if ((strlen(name) > 0) && (name[strlen(name) - 1] == '\n'))
                name[strlen(name) - 1] = '\0';
                printf("Hello %s. Nice to meet you.\n", name);
            break;

            case 2:
                printf("Your choice is case 2\n");
            break;
        }
    }
    return 0;
}
...