我想问你如何使用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。我不是很熟悉,我不知道如何逃避像(),_,等等的字符。
答案 0 :(得分:5)
可以按字面指定输入中未更改的部分,您不需要%* 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的返回值!您不想使用垃圾值进行攻击。请注意,格式中的单个空格会跳过任意数量的空格,因此)
之后的空格会跳过输入中的换行符。
答案 1 :(得分:0)
对于第一行你可以试试这样的东西。但是第二行可能很棘手:)
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);
答案 2 :(得分:0)
#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;
}