Scanf не вызывается - PullRequest
       3

Scanf не вызывается

0 голосов
/ 16 января 2019

Я пытаюсь прочитать всю строку, используя scanf несколько раз, и по некоторым причинам это работает только в первый раз. При втором запуске цикла компилятор игнорирует функцию scanf

Вот мой код:

#include <stdio.h>
int main()
{
    char msg[100];
    char to[100];
    while (1)
    {
        printf("[]:Msg to ? :");
        scanf("%s", to);
        printf("[]:Msg: ");
        scanf("%99[^.]", msg);
        printf("Sending %s\n", msg);
    }
    return 0;
}

И это вывод, который мне дан:

[]: Msg to? : Him []: Msg: Здравствуйте, господин его !. Отправка Привет господин

он! []: Msg to? : []: Msg:

И здесь я ожидал, что смогу изменить переменную на ... Добавление пробела до% s по какой-то причине здесь не имеет никакого эффекта

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Если вы хотите прочитать всю строку, используя scanf, вы можете использовать% [^ \ n] вместо% 99 [^.]. И обязательно добавьте getchar (), если какая-либо клавиша 'enter' была нажата непосредственно перед сканированием с помощью% [^ \ n]. Изменения, показанные в приведенном ниже коде, могут быть полезны:

while (1)
{
    printf("[]:Msg to ? :");
    scanf("%[^\n]", to);
    getchar();
    printf("[]:Msg: ");
    scanf("%[^\n]", msg);
    getchar();
    printf("Sending %s\n", msg);
}
0 голосов
/ 16 января 2019

Проблема здесь:

scanf("%99[^.]", msg);

Этот оператор читает до 99 символов, но только до следующего несоответствующего символа.Теперь, если вы поместите

Здравствуйте, господин его!.

во входной буфер, у вас действительно будет

"Hello mister him!.\n"

в буфере входного потока stdin,Теперь scanf обрабатывает все, вплоть до (но не включая) точки, поэтому точка и символ новой строки остаются во входном буфере.Следующий вызов scanf()

scanf("%s", to);

теперь выбирает точку и новую строку из буфера вывода, который автоматически завершает следующую строку для чтения.Теперь входной буфер пуст и следующий scanf ожидает следующего сообщения.

Чтобы исправить это, вы можете пропустить точку и символ новой строки следующим образом:

scanf("%99[^.]", msg);
getchar(); // Pacman (Eat the dot)

ив другом scanf используйте

// scanf(" %s", to); // Skip the preceding newline

(это необязательно, как указал HS)

Обратите внимание, что случай ввода сообщения> 99 символов не обрабатывается должным образомеще.

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