首页 > 解决方案 > 如何使用 scanf() 或 scanf_s() 向用户询问字符串?

问题描述

我将首先说我是 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");
}

我希望输出是“你的名字是(你输入的名字)”。但是,我似乎根本无法让它工作。任何帮助表示赞赏。

标签: carraysstringcharscanf

解决方案


使用scanf_s()方式与使用scanf(). 你应该使用:

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

或附近。使用scanf(),您将省略该sizeof(name)论点。

"%19s"格式将跳过前导空白,然后开始保存非空白字符并在第一个空白字符处停止阅读,因此键入Jonathan Bailey只会读Jonathanname. 如果您想要任何字符,包括空格,那么您需要将格式更改为" %19[^\n]"(引号和百分比之间的空格非常重要)并确保您以某种方式阅读了行的剩余部分(包括换行符)。格式中的前导空格会跳过输入中的前导空格,包括换行符。不要在格式中添加尾随空格;这是一场 UI 灾难。

此外,请考虑阅读整行fgets()并处理结果的优点——它避免了一些复杂性。您可以使用sscanf()读取结果 - 或您自己选择的自定义解析。使用足够大的缓冲区:

char buffer[4096];

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

推荐阅读