2011-11-15 4 views
4

Je cours le code suivant dans C. Je n'obtiens pas la bonne réponse.sscanf avec le délimiteur "_" dans C

int main() 
{ 

    char test[100] = "This_Is_A_Test_99"; 
    char tmp1[10],tmp2[10],tmp3[10],tmp4[10],tmp5[10]; 

    sscanf(test,"%[^'_'],%[^'_'],%[^'_'],%[^'_'],%s",tmp1,tmp2,tmp3,tmp4,tmp5); 

    printf ("Temp 1 is %s\n",tmp1); 
    printf ("Temp 2 is %s\n",tmp2); 
    printf ("Temp 3 is %s\n",tmp3); 
    printf ("Temp 4 is %s\n",tmp4); 
    printf ("Temp 5 is %s\n",tmp5); 

    return 0; 
} 

La sortie que je reçois est

Temp 1 is This 
Temp 2 is 
Temp 3 is 
Temp 4 is 
Temp 5 is 

Qu'est-ce que je dois faire chercher "Ce" "est" "A" "Test" et "99" sur des variables individuelles.

+0

Offtopic mais '% [^ '_']' ressemblait à un visage de robot mignon! roulettes Et vous en avez quatre assemblés en ligne. – syockit

Répondre

10
sscanf(test,"%[^'_'],%[^'_'],%[^'_'],%[^'_'],%s",tmp1,tmp2,tmp3,tmp4,tmp5); 

devrait être

sscanf(test,"%[^_]_%[^_]_%[^_]_%[^_]_%s",tmp1,tmp2,tmp3,tmp4,tmp5); 

Notez que vous séparant les des espaces réservés avec , au lieu de _.

Voir http://ideone.com/8zBmG.

De même, vous n'avez pas besoin de ' s, sauf si vous souhaitez ignorer les guillemets simples.

(BTW, vous devriez jeter un coup d'oeil dans strtok_r.)

+0

Tous les spécificateurs ne devraient-ils pas avoir 's' à la fin? – cnicutar

+1

@cnicutar: [No] (http://pubs.opengroup.org/onlinepubs/007904975/functions/scanf.html). – kennytm

+0

Je ne le savais pas, gentil :-) – cnicutar

1

Il me semble que vous avez inclus des virgules (,) dans votre chaîne sscanf.

Mais il n'y a pas de virgules dans votre saisie. Sans des virgules pour traiter, sscanf omet après la première chaîne "This"

Je recommande d'essayer la chaîne de format:

"%[^_]_%[^_]_%[^_]_%[^_]_%s" 
+0

N'importe quoi pour faire correspondre les traits de soulignement (n'ont pas utilisé 'scanf' depuis longtemps, mais cela me semble étrange). –

+0

@David: point pris. fixé. – abelenky

+0

Merci les gars. – Kitcha

3

Vous numérisez commata entre vos chaînes, et il n'y en a pas dans le texte. Retirez-les du motif:

sscanf(test,"%[^'_']%[^'_']%[^'_']%[^'_']%s",tmp1,tmp2,tmp3,tmp4,tmp5); 

Les apostrophes sont probablement inutiles. Vous n'avez pas besoin de citer quoi que ce soit car aucun shell va développer:

sscanf(test,"%[^_]%[^_]%[^_]%[^_]%s",tmp1,tmp2,tmp3,tmp4,tmp5); 

Reprenant la suggestion de PMG, vous devez écrire la longueur de votre temporaire explicitement dans les arguments de scanf pour vous assurer que vous ne recevez pas tampons: déversoirs

sscanf(test,"%9[^_]%9[^_]%9[^_]%9[^_]%9s",tmp1,tmp2,tmp3,tmp4,tmp5); 

Et puis vérifier la valeur de retour:

int token_count = sscanf(test,"%9[^_]%9[^_]%9[^_]%9[^_]%9s",tmp1,tmp2,tmp3,tmp4,tmp5); 
if (token_count != 5) { fprintf(stderr, "Something went wrong\n"); exit(42); }