C编程 - 用空格分隔的tkens的sscanf

时间:2016-03-26 12:04:31

标签: c scanf fgets strtok

我目前正在尝试使用C编写程序(对C来说很新 - 只学习了2周),我想通过stdin从用户那里获得一串输入,其中字符串包含一个字符,然后是2个浮点数(每个浮点数之间有空格)。例如:" y 2.1 1.1"。 我的问题是如何获取和存储3个输入,同时确保第一个是char,以下两个输入是浮点数?

2 个答案:

答案 0 :(得分:1)

坚持使用sscanf(),但不要忘记检查其返回值(查看here)。输入“y 1u 1”的实际情况是sscanf将读取并存储有效的char,然后它将读取并存储int } 1,这是有效的,然后停止,因为“u”与格式字符串不匹配。

以下是示例代码(使用scanf()而不是fgets()sscanf())。

char in1;
int in2,in3;
int retval;

/*
char array[100] = {'\0'};
fgets(array, 100, stdin);
retval = sscanf(array, "%c %d %d", &in1, &in2, &in3);
*/
retval = scanf("%c %d %d", &in1, &in2, &in3);

printf("Scanned %d items\n", retval);

printf("Here they come: ");
if(retval > 0) {
    printf("%c ", in1);
}
if(retval > 1) {
    printf("%d ", in2);
}
if(retval > 2) {
    printf("%d", in3);
}
putchar('\n');

答案 1 :(得分:0)

  

如何获取并存储3个输入,同时确保第一个是char,以下两个输入是整数?

     

这段代码的问题是最后有多余的空格,我不知道如何摆脱它。

使用sscanf()并检查扫描变量后是否有额外任何的简单方法是使用"%n"记录此时扫描的位置。

char in1;
int in2, in3;
int n = 0;
sscanf(array,"%c %d %d%n", &in1, &in2, &in3, &n);

if (n > 0 && (array[n] == '\n' || array[n] == '\0')) {
  Success(in1, in2, in3);
}

检查sscanf()的结果始终很重要。一种方法是检查它的返回值,这里应该是3。不幸的是,这并没有告诉我们in3之后是否存在任何问题。通过设置n == 0然后测试n > 0,代码知道扫描已成功完成"%n"。代码还可以测试扫描停止的字符。