2011-10-25 13 views
10

Estoy intentando extraer una cadena y un entero de una cadena usando sscanf:C - No sscanf trabajo

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

Pero esto me da la salida:

Keyword:command:3 
Context:1971293397 

estoy esperando este ouput:

Keyword:command 
Context:3 

¿Por qué se comporta como sscanf esto? Gracias de antemano por su ayuda!

+1

¿Hay alguna buena razón para que no verifique el resultado de 'sscanf'? –

Respuesta

14

sscanf espera que los %s fichas para ser delimitado un espacio en blanco (tabulaciones, espacios de nueva línea), por lo que tendría que tener un espacio entre la cuerda y el:

para un aspecto desagradable truco que puede probar:

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

que obligará al token a no coincidir con los dos puntos.

+0

¿Quieres decir que no puedo usar ":" como delimitador? – dpp

+0

¿No es posible extraer la cadena y un integer del "comando: 3"? – dpp

+0

sí, es: 'sscanf (Comando,"% 7s:% d ", Palabra clave, & Contexto);' en el otro extremo, esto acepta solo comandos de 7 caracteres de longitud. – fritzone

2

usa una convención %[ aquí. ver la página del manual de 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; 
} 

que da "aquí: comando: 3" como su salida.

5

Si no es particular acerca de usar sscanf, siempre puede usar strtok, ya que lo que quiere es tokenizar su cadena.

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

Esto es mucho más fácil de leer, en mi opinión.

+0

Gracias, pero quiero estudiar 'sscanf'. – dpp

+0

Lo he usado para mis códigos, gracias. – dpp