2011-10-25 18 views
10

sscanf:C - sscanf çalışmıyor

#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; 
} 

kullanarak bir dize ve bir tamsayı ayıklamak için çalışıyorum Ama bu bana çıktı verir:

Keyword:command:3 
Context:1971293397 

Bunu beklemiyorum:

Keyword:command 
Context:3 

sscanf neden böyle davranıyor? Yardımlarınız için şimdiden teşekkür ederiz!

+1

'sscanf' sonucunu kontrol etmemenizin iyi bir nedeni var mı? –

cevap

14

sscanf sen dize arasında bir boşluk olurdu böylece %s belirteçleri boşluk, (sekme, boşluk, yeni satır) sınırlandırılmış olmasını bekler

Belirtecin iki nokta üst üste eşleşmemesi için zorlaması gereken

.

+0

Yani, ":" sınırlayıcı olarak kullanmamın bir yolu yok mu? – dpp

+0

Yani "command: 3" den string ve integeer elde etmek mümkün değil mi? – dpp

+0

evet, öyle: 'sscanf (Komut,"% 7s:% d ", Anahtar Kelime, & Bağlam);' diğer tarafta, bu sadece 7 karakter uzunluğunda olan komutları kabul eder. – fritzone

2

%[ sözleşmesini burada kullanın. verir 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; 
} 

": komutu: burada: 3" çıktısı olarak scanf kılavuz sayfasına bakınız.

5

Eğer sscanf kullanımı konusunda özellikle emin değilseniz, her zaman strtok kullanabilirsiniz, çünkü istediğiniz şey dizginizi belirtmektir.

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

Bu daha çok okunabilir, bence.

+0

Teşekkürler, ama sscanf'ın çalışmasını istiyorum. – dpp

+0

Bunu kodlarıma kullandım, teşekkürler. – dpp

İlgili konular