Подтвердить что ты не робот

Почему scanf дважды запрашивает ввод, когда в конце строки форматирования стоит новая строка?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *method1(void)
{
    static char a[4];
    scanf("%s\n", a);
    return a;
}

int main(void)
{
    char *h = method1();
    printf("%s\n", h);
    return 0;
}

Когда я запускаю приведенный выше код, приглашение дважды запрашивает ввод данных (я использую scanf только один раз в коде). Это почему?

(Я ввел 'jo'; он запросил дополнительные данные, поэтому я снова ввел 'jo'. Тогда он только распечатал 'jo' один раз.)

4b9b3361

Ответ 1

Из моей страницы руководства scanf

Белое пространство (например, пробелы, вкладки или символы новой строки) в строке формата соответствует любому количеству пробелов, в том числе ни одного, на входе. Все остальное соответствует только самому.

Таким образом, при scanf ("%s\n", a) он будет искать строку, за которой следует дополнительное пустое пространство. Поскольку после первой новой строки может появиться больше пробелов, scanf не выполняется после первой новой строки и выглядит следующим образом. Вы заметите, что вы можете ввести любое количество строк новой строки (или вкладки или пробелы), а scanf все равно будет ожидать большего.

Однако, когда вы вводите вторую строку, последовательность пробелов делится и сканирование останавливается.

Используйте scanf ("%s", a), чтобы не сканировать конечные пробелы.

Ответ 2

вам нужно удалить \n из строкового формата scanf. Это должно быть

scanf("%s",a);

EDIT: Объяснение

%s означает, что scanf считывает входной символ до тех пор, пока он не получит разделитель, который должен быть пробелом, например пробелом или вкладкой или новой строкой (\n), поэтому первый ввод получает как разделитель для "%s" и добавление "\n" в формат строки "%s\n" означает, что scanf будет ждать две строки новой строки, первая строка новой строки связана с разделителем "%s", а вторая строка новой строки связана с \n строки формат.

Ответ 3

использовать gets() или fgets() вместо... альтернативно использовать scanf ( "% [^\n] s", a);

Ответ 4

Удалите \n из формата scanf и дайте ввод, и он покажет вывод, основанный на заданном выводе, один раз.

Ответ 5

Вы можете использовать любой из них, чтобы избежать упомянутой проблемы: scanf("%s",a); или scanf("\n%s",a);

Ответ 6

Не используйте escape-последовательность в функции scanf stdio

     scanf ("%s", a);