Как вы используете scanf () или scanf_s (), чтобы запросить у пользователя строку символов? - PullRequest
1 голос
/ 10 июля 2019

Я начну с того, что я новичок в C и программировании в целом, и я впервые задаю вопрос о программировании онлайн.

Я использую Visual Studio 2019.

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

Я просмотрел онлайн и все найденные примеры вылетали, когда я пытался запустить код, или сбой, когда я набирал слово после того, как он запрашивал имя. Я пытался использовать как scanf (), так и scanf_s ().

#include <stdio.h>
main()
{
    char name[20];
    printf("Enter name: ");
    scanf_s("%s", name);
    printf("Your name is %s.", name);
    system("pause");
}

Я ожидаю, что результатом будет «Ваше имя (имя, которое вы ввели)». Но я не могу заставить его работать вообще. Любая помощь приветствуется.

1 Ответ

1 голос
/ 10 июля 2019

При использовании scanf_s() вы делаете это иначе, чем при scanf(). Вы должны использовать:

if (scanf_s("%19s", name, sizeof(name)) == 1)
{
    …got valid string…
}
else
{
    …error handling…
}

или около того. С scanf() вы бы пропустили аргумент sizeof(name).

Формат "%19s" пропустит начальные пробелы, а затем начнет сохранять непробельные символы и прекратит чтение с первого пробела, поэтому при наборе Jonathan Bailey будет считываться только Jonathan в name. Если вам нужны какие-либо символы, включая пробелы, вам нужно изменить формат на " %19[^\n]" (где пробел между кавычкой и процентом очень важен) и убедиться, что вы как-то прочитали остаток строки (включая символ новой строки). Ведущий пробел в формате пропускает начальный пробел во вводе, включая переводы строки. Не добавляйте конечный пробел в формат; это катастрофа пользовательского интерфейса.

Также рассмотрим преимущества чтения всей строки с fgets() и последующей обработки результата - это позволяет избежать некоторых сложностей. Вы можете использовать sscanf(), чтобы прочитать результат - или пользовательский анализ по вашему выбору. Используйте достаточно большой буфер:

char buffer[4096];

if (fgets(buffer, sizeof(buffer), stdin) != NULL)
{
    buffer[strcspn(buffer, "\n")] = '\0';  // Zap newline
    …process line…
}
...