2013-06-04 2 views
3

Я хотел бы спросить вас, как я могу получить значения 043, 21.45, 45.65, 9.34, 3.46 с использованием sscanf.Возвращаемые значения с помощью sscanf

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. Я не очень хорошо знакомы, и я не знаю, как избежать символы, такие как(), _ ,: т.д.

+1

Вы прочитали документацию sscanf? –

+1

Я попытался понять это из следующего источника, но у него есть пример для простого предложения, а не как мой http://www.cplusplus.com/reference/cstdio/sscanf/ – dali1985

+0

Следуйте «см. Также» по адресу http://www.cplusplus.com/reference/cstdio/scanf/, который имеет гораздо больше информации о формате. В частности, «Любой символ, который не является символом пробела (пустой, новой строкой или вкладкой) или частью спецификатора формата (который начинается с символа%), заставляет функцию читать следующий символ из потока, сравнивать его с этим не-пробельный символ, и если он совпадает, он отбрасывается, и функция продолжается со следующим символом формата ». ... Вы можете использовать это, чтобы пропустить константные части вашего формата ввода. –

ответ

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! Вы не хотите, чтобы солдат был с мусорными знаками. И обратите внимание, что одно пробел в формате пропускает любое количество пробелов, поэтому пробел после ) пропускает новую строку на входе.

+0

Это выражение 'if' выглядело бы намного лучше, если бы вы отделили выделение от него. – Sebivor

+0

О, ну, это идиома, которую я узнал из K & R, первое издание. Позвоните мне в старую школу :-) – Jens

+0

@Jens: Как уже упоминалось выше, выход будет Temp = 21.450001. Как мы можем поддерживать точность? так что выводится только 21.450000. – mario

0

Для первой линии вы можете попробовать что-то вроде this.But второй линии может быть сложно :)

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); 
+0

Нет необходимости изменять формат ввода, чтобы содержать пробелы, если вы изменяете строку формата. – Jens

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; 
} 
Смежные вопросы