Как мне прочитать пользовательский ввод через несколько строк, пробелов и т. Д.? - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь просканировать какой-то пользовательский ввод, но когда я запускаю программу, все, что я получаю, это куча 3/4 фракций.

Мне нужно иметь возможность сканировать символы, пробелы и разрывы строк. Если пользователь вводит что-то вроде:

Hello this
  is
     a test123 234     !!!

Как только они закончат вводить то, что хотят ввести, они нажмут CTRL + D, и вот как я узнаю, чтобы перестать читать то, что они говорят.

Вот мой код:

char user_input[1000];
int i = 0;
    while (scanf("%c", &user_input[i]) == 1) {
        i++;
}

Ответы [ 2 ]

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

Чтобы иметь больше контроля над пользовательским вводом, вы можете прочитать пользовательский ввод за символом с помощью getchar () , обычно он возвращает EOF, когда пользователь вводит CTRL-D, обычно. После этого строку можно проанализировать для извлечения введенных дробей и т. П.

Если вы все еще хотите использовать что-то вроде scanf (), вы можете заменить его вызовом fgets () , чтобы предотвратить переполнение буфера. Или используйте scanf () с соответствующей строкой форматирования ( с указанным максимальным количеством символов ).

    /* gcc -o test_getchar test_getchar.c  && ./test_getchar */

    #include <stdio.h>

    int main()
    {
        char user_input[1000] = {0};
        int i = 0;
        char c;
        while ((c = getchar()) != EOF) {
            /* do something with c here... */
            user_input[i] = c;
            ++i;
            if (i >= sizeof(user_input)-1)
                break;
        }
        user_input[i] = 0;
        printf("user input: %s\r\n", user_input);
        return 0;
    }
0 голосов
/ 09 мая 2018

Ваш код в порядке. Следующая программа:

#include <stdio.h>

int main()
{
    char user_input[1000];
    int i = 0;
    while (scanf("%c", &user_input[i]) == 1) {
        i++;
    }
    user_input[i] = '\0';
    printf("%d\n", i);
    printf("%s", user_input);
    return 0;
}

Произведено с вашим вводом следующее:

42
Hello this
  is
     a test123 234     !!!

Однако scanf обычно используется для ввода scan formatted. Я бы посоветовал читать по одному символу за раз, используя getchar() или fgets()

int main(void) {
   char user_input[1000];
   int i = 0;
   int temp;
   while ((temp = getchar()) != EOF) {
        user_input[++i] = temp;
   }
   user_input[i] = '\0';
}
...