我想接受标准输入中的变量,但我不想定义我接受的变量数量,以便用户可以提交两个或三个变量。
例如我会:
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个变量
答案 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
(这是一个负整数)。