您如何使用scanf()或scanf_s()向用户询问字符串?

时间:2019-07-10 02:48:28

标签: c arrays string char scanf

首先,我是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 个答案:

答案 0 :(得分:1)

使用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]"(其中引号和百分号之间的空格非常重要),并确保您阅读了该行的剩余部分(包括换行符)不知何故。格式中的前导空格会跳过输入中的前导空白,包括换行符。不要在格式中添加尾随空格;那是UI灾难。

还要考虑使用fgets()读取整行然后处理结果的优点-这样可以避免一些麻烦。您可以使用sscanf()来读取结果-或您自己选择的自定义解析。使用足够大的缓冲区:

char buffer[4096];

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