c-用逗号(带sscanf)读取输入

  • 本文关键字:读取 sscanf c input scanf
  • 更新时间 :
  • 英文 :


嗨,我正在尝试读取以下形式的用户输入:

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

这导致了未定义的行为,因为追加的被写入超出了数组的边界。

如果你想阅读和打印逗号分隔的单词,你可以使用:

#include <stdio.h>
int main()
{
char input[60];
char a1[15], a2[15], a3[15], a4[15];
for(int i; i < 10; i++)
{
a1[i] = a2[i] = a3[i] = a4[i] = 0;  // Initialize each character with ``.
}
printf("Enter infon");
fgets(input, 60, stdin);
sscanf(input,"%[^,n],%[^,n],%[^,n],%[^n]", a1, a2, a3, a4);

printf("%s %s %s %s", a1, a2, a3, a4);
return 0;
}

执行:

/a.out
hello,mister,tamborine,man
hello mister tamborine man

最新更新