接受来自标准输入的用户输入,其中可变输入的量可以变化

时间:2017-02-23 05:51:51

标签: c scanf

我想接受标准输入中的变量,但我不想定义我接受的变量数量,以便用户可以提交两个或三个变量。

例如我会:

char key;
char name1[100];
char name2[100];


printf("Hello! insert your command:\n");
scanf("%c %s %s",&key, name1, name2);

但是用户不需要插入第二个名称,以便输入" F John"和" L John Doe" " X"都会被接受。基本上我不希望输入长度是预定的我只需要接受1 2或3个变量。 scanf是正确的方法吗?还是有更好的方法?

目前它等待分配所有3个变量

2 个答案:

答案 0 :(得分:1)

您可以使用fgets()读取整个输入字符串,然后使用sscanf()从字符串中读取变量。 sscanf()返回成功读取字段的数量。您可以使用此数字来确定已初始化的变量。

char buffer[100];
int n;
printf("Hello! insert your command:\n");
fgets(buffer, sizeof(buffer), stdin);
n = sscanf(buffer, "%c %s %s", &key, name1, name2);
# 1, 2 or 3

正如评论中所指出的那样,该行的其余部分也将被读取(最多100-1=99个字符)。我假设在该行的其余部分没有更多感兴趣的领域。

答案 1 :(得分:1)

  

scanf是正确的方法吗?还是有更好的方法?

是的,scanf完全适用于此。但是,您需要注意,您在格式字符串中使用的空格不是;它们具有不同的含义,因为它们不仅匹配单个空格,而且匹配任何序列零个或多个空格字符(包括空格,制表符,换行符)。您将要使用%*1[^ ]指令。为清晰起见,您可以将其定义为#define SPACE_FORMAT "%*1[^ ]",并按如下方式使用它:

int n = scanf("%c" SPACE_FORMAT "%s" SPACE_FORMAT "%s", &key, name1, name2);

请仔细注意我如何将返回值存储到n;如果scanf成功匹配并分配给:

  • 只有第一个对象(由&key指向),它只会返回1 ...
  • 第一个(由&key指向)和第二个(由name1指向)对象,它将返回2 ...
  • ......等等。如果scanf由于某些读取错误或达到EOF而失败,则会返回EOF(这是一个负整数)。