2011-10-25 16 views
10

Próbuję wyodrębnić ciąg oraz całkowitą Spośród ciąg przy użyciu sscanf:C - nie sscanf pracy

#include<stdio.h> 

int main() 
{ 
    char Command[20] = "command:3"; 
    char Keyword[20]; 
    int Context; 

    sscanf(Command, "%s:%d", Keyword, &Context); 

    printf("Keyword:%s\n",Keyword); 
    printf("Context:%d",Context); 

    getch(); 
    return 0; 
} 

Ale to daje mi komunikat:

Keyword:command:3 
Context:1971293397 

jestem oczekując tego ouput:

Keyword:command 
Context:3 

Dlaczego sscanf zachowuje się jak ten? Z góry dziękuję za pomoc!

+1

Czy istnieje dobry powód, dla którego nie sprawdzasz wyniku 'sscanf'? –

Odpowiedz

14

sscanf spodziewa się %s tokeny być rozdzielany białe znaki (zakładka, przestrzeń, znak nowej linii), więc trzeba by mieć przestrzeń pomiędzy ciągiem a:

za brzydkie patrząc włamać można spróbować:

sscanf(Command, "%[^:]:%d", Keyword, &Context); 

która wymusi, że token nie pasuje do dwukropka.

+0

Masz na myśli, nie ma możliwości użycia ":" jako ogranicznika? – dpp

+0

Więc nie można wyodrębnić ciąg i integer z "command: 3"? – dpp

+0

tak, to jest: 'sscanf (polecenie,"% 7s:% d ", słowo kluczowe i kontekst);' na drugim końcu, akceptuje tylko polecenia, które mają 7 znaków. – fritzone

2

użyć konwencji %[ tutaj. zobacz stronę podręcznika z scanf: http://linux.die.net/man/3/scanf

#include <stdio.h> 

int main() 
{ 
    char *s = "command:3"; 
    char s1[0xff]; 
    int d; 
    sscanf(s, "%[^:]:%d", s1, &d); 
    printf("here: %s:%d\n", s1, d); 
    return 0; 
} 

co daje "tutaj: polecenie: 3" jako wyjście.

5

Jeśli nie chcesz używać sscanf, zawsze możesz użyć strtok, ponieważ to, czego chcesz, to tokenizacja łańcucha znaków.

char Command[20] = "command:3"; 

    char* key; 
    int val; 

    key = strtok(Command, ":"); 
    val = atoi(strtok(NULL, ":")); 

    printf("Keyword:%s\n",key); 
    printf("Context:%d\n",val); 

Jest to o wiele bardziej czytelne, moim zdaniem.

+0

Dzięki, ale chcę się uczyć "sscanf". – dpp

+0

Użyłem tego do moich kodów, dzięki. – dpp