sscanf con delimitador “_” en C

Estoy ejecutando el siguiente código en C. No obtengo la respuesta correcta.

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 salida que obtengo es

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

¿Qué es lo que tengo que hacer buscar “Esto” “Es” “A” “Prueba” y “99” en variables individuales.

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

debiera ser

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

Tenga en cuenta que está separando los marcadores de posición con , lugar de _ .

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

Además, no necesita la ' s a menos que desee omitir las comillas simples también.

(Por cierto, deberías echar un vistazo a strtok_r .)

Usted está explorando commata entre sus cadenas, y no hay ninguna en el texto. Eliminarlos del patrón:

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

Los apóstrofes son probablemente innecesarios, también. No necesitas citar nada ya que ninguna shell lo va a expandir:

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

Retomando la sugerencia de pmg, debe escribir la longitud de su temporario explícitamente en los argumentos de scanf para asegurarse de que no obtenga desbordamientos de búfer:

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

Y luego verifique el valor de retorno:

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

Me parece que has incluido comas (,) en tu cadena sscanf .

Pero no hay comas en su entrada. Sin comas que procesar, sscanf está fallando después de la primera cadena "This"

Recomiendo probar la cadena de formato:

 "%[^_]_%[^_]_%[^_]_%[^_]_%s"