嗨,我正在尝试读取以下形式的用户输入:
param1,param2,param3
我用fgets
得到的。问题是,我似乎不明白为什么它没有,在第一个逗号之后,它向我展示了一种奇怪的行为。例如:
char input[60];
char a1, a2, a3, a4;
printf("Enter info");
fgets(input, 60, stdin);
sscanf(input,"%[^,n] %[^,n] %[^,n] %[^,n]", &a1, &a2, &a3, &a4);
printf("%c %c %c %c", a1, a2,a3, a4);
如果我键入例如a,b,c,d
我得到:a �
我在这里错过了什么?
添加到答案中。您的格式字符串缺少实际的,
逗号,因此1,2,3,4
无法与其匹配。
你可以做一些类似的事情
#include <stdio.h>
int main()
{
char input[60];
char a1[2], a2[2], a3[2], a4[2];
printf("Enter info");
fgets(input, 60, stdin);
if (4 != sscanf(input,"%1[^,n], %1[^,n], %1[^,n], %1[^,n]", a1, a2, a3, a4))
return printf("Error"), 1;
printf("%c %c %c %c", a1[0], a2[0],a3[0], a4[0]);
return 0;
}
注意sscanf
的错误检查,如果成功,它应该返回它用数据填充的变量数。如果有效的话,一定是4。
更改参数的数组大小以及sscanf
格式字符串中%
之后的数字,以满足您的需要。
编辑:如果输入的参数太多,为了让它抛出错误,你可以做这个
#include <stdio.h>
int main()
{
char input[60];
char a1[2], a2[2], a3[2], a4[2];
char temp[2];
printf("Enter info");
fgets(input, 60, stdin);
if (4 != sscanf(input,"%1[^,n], %1[^,n], %1[^,n], %1[^,n] %1[^n]", a1, a2, a3, a4, temp))
return printf("Error"), 1;
printf("%c %c %c %c", a1[0], a2[0],a3[0], a4[0]);
return 0;
}
通过将%1[^n]
添加到格式的末尾,sscanf
将尝试读取四个参数之后的另一个非空白字符。如果成功,则意味着例如1,2,3,4,5
的输入中有太多参数。它将返回5,这是它能够填充的数据数量。但是,如果输入有效,那么最后一个格式说明符不应该与任何内容匹配,因此在输入有效的情况下,sscanf
应该正好返回4。
问题是%[
格式说明符在使用字符序列时附加了一个空字符。
它需要有一个类型为char[]
的适当参数,该参数至少能够容纳字符加上null字符,但在您的示例中,每个%[
的相对参数的类型仅为char
。
这导致了未定义的行为,因为追加的