【问题标题】:Return values with sscanf使用 sscanf 返回值
【发布时间】:2013-06-04 07:31:37
【问题描述】:

我想问你如何使用 sscanf 获取值 043、21.45、45.65、9.34、3.46。

Parameters: 43 VALUES FROM 0000:0000 (043)
Name_8:(Temp=21.45,Hum=45.65,AR=9.34,Volt=3.46V)

直到 FROM 我知道代码是这样的

char str[20];
sscanf(buff,"%*s %*d %*s %s",str);
printf("Results %s\n",str);

这让我回来了

Results FROM

但我不知道如何继续使用 sscanf。我不是很熟悉,也不知道如何转义(),_,:等字符。

【问题讨论】:

  • 您阅读过 sscanf 文档吗?
  • 我试图从以下来源理解它,但它有一个简单句子的例子,不像我的cplusplus.com/reference/cstdio/sscanf
  • 按照“另请参阅”到cplusplus.com/reference/cstdio/scanf,其中包含有关格式的更多信息。特别是,“任何不是空白字符(空格、换行符或制表符)或格式说明符的一部分(以 % 字符开头)的字符都会导致函数从流中读取下一个字符,将其与非空白字符,如果匹配,则将其丢弃,函数继续使用格式的下一个字符。” ...您可以使用它来跳过输入格式的常量部分。

标签: c scanf


【解决方案1】:

输入中不变的部分可以按字面意思指定,你不需要 %*s 来跳过它们。可以使用您使用的 %*d 和 %*s 跳过变体部分。运行这个

#include <stdio.h>

int main (void)
{
    char buff[] = "Parameters: 43 VALUES FROM 0000:0000 (043)\n"
                  "Name_8:(Temp=21.45,Hum=45.65,AR=9.34,Volt=3.46V)";
    int tag;
    float Temp, Hum, AR, Volt;
    int n;

    n = sscanf (buff, "Parameters: %*d VALUES FROM %*d:%*d (%d) "
                      "Name_%*d:(Temp=%f,Hum=%f,AR=%f,Volt=%fV)",
                       &tag,    &Temp,   &Hum, &AR,  &Volt);
    if (n == 5) {
        printf ("tag = %d, Temp = %f, Hum = %f, AR = %f, Volt = %f\n",
                 tag, Temp, Hum, AR, Volt);
    } else {
        printf ("Couldn't scan all items (converted %d).\n", n);
    }
    return 0;
}

会输出

tag = 43, Temp = 21.450001, Hum = 45.650002, AR = 9.340000, Volt = 3.460000

始终检查 sscanf 的返回值!您不想继续使用垃圾值。请注意,格式中的单个空格会跳过任意​​数量的空格,因此) 之后的空格会跳过输入中的换行符。

【讨论】:

  • if 表达式如果将赋值分开的话会更好看。
  • 哦,好吧,这是我从 K&R 第一版学到的成语。叫我老派:-)
  • @Jens:如上所述,输出将是 Temp = 21.450001。我们如何保持精度?所以只输出 21.450000。
【解决方案2】:

对于第一行你可以尝试这样的事情。但是第二行可能会很棘手:)

 char f1[] = "Parameters: 43 VALUES FROM 0000:0000 (043)";
 int d = 0;
 sscanf(f1, "%*s %*s %*s %*s %*s (%d)",&d);
 printf("D %d \n", d);

但是,如果您可以通过在数值之间添加空格来修改第二个类似

 char f2[] = "Name_8:(Temp= 21.45,Hum= 45.65,AR= 9.34,Volt= 3.46V)";

然后你可以用它来读取浮点值

float te= 0, h = 0, ar = 0, v = 0;
sscanf(f2, "%*s %f%*s %f%*s %f%*s %f)",&te, &h, &ar, &v);

【讨论】:

  • 如果您调整格式字符串,则无需将输入格式更改为包含空格。
【解决方案3】:
#include <stdio.h>

int main(void){
    char buff[] = "Parameters: 43 VALUES FROM 0000:0000 (043)\n"
                "Name_8:(Temp=21.45,Hum=45.65,AR=9.34,Volt=3.46V)";
    char dev[25], temp[25], hum[25], ar[25], volt[25];
    int pos = 0, len;
    sscanf(buff, "%*[^(](%[^)])%n", dev, &len);
    pos += len;
    sscanf(buff + pos, "%*[^(](Temp=%[^,],%n", temp, &len);
    pos += len;
    sscanf(buff + pos, "Hum=%[^,],%n", hum, &len);
    pos += len;
    sscanf(buff + pos, "AR=%[^,],%n", ar, &len);
    pos += len;
    sscanf(buff + pos, "Volt=%[^V]V%n", volt, &len);
    printf("dev:%s\n", dev);
    printf("temp:%s\n", temp);
    printf("hum:%s\n", hum);
    printf("ar:%s\n", ar);
    printf("volt:%s\n", volt);
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    相关资源
    最近更新 更多