[英]Read input with commas (with sscanf)
您好我正在尝试以下列形式读取用户的输入:
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。
问题是%[
格式说明符附加了一个 null 字符,因为它消耗了一个字符序列。
它需要有一个适当的char[]
类型的参数,至少能够保存字符加上 null 字符,但是每个%[
的相对 arguments 在您的示例中仅属于char
类型。
这会导致未定义的行为,因为附加的\0
写入超出了数组的范围。
如果您想阅读和打印逗号分隔的单词,您可以使用:
#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 `\0`.
}
printf("Enter info\n");
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.