¿Cómo dividir la cadena (carácter) y la variable en 1 línea en C?

¿Cómo puedo dividir carácter y variable en 1 línea?

Ejemplo

ENTRADA

car1900food2900ram800 

SALIDA

 car 1900 food 2900 ram 800 

Código

 char namax[25]; int hargax; scanf ("%s%s",&namax,&hargax); printf ("%s %s",namax,hargax); 

Si uso código como ese, necesito doble ingreso o espacio para hacer salida. ¿Cómo puedo dividir sin eso?

Debería poder usar un código como este para leer un nombre y número:

 if (scanf("%24[a-zA-Z]%d", namax, &hargax) == 2) …got name and number OK… else …some sort of problem to be reported and handled… 

Necesitaría envolver eso en un bucle de algún tipo para obtener tres pares de valores. Tenga en cuenta que usar &namax como argumento para scanf() es técnicamente incorrecto. Todas las notaciones %s , %c y %[…] (conjunto de escaneo) esperan un argumento char * , pero está pasando un char (*)[25] que es bastante diferente. Una coincidencia fortuita significa que usualmente se sale con la suya, pero aún no es correcto y omitir el & es fácil (y correcto).

Puede encontrar detalles sobre los conjuntos de escaneo, etc. en la especificación POSIX de scanf() .

Debería considerar leer una línea completa de entrada con fgets() o POSIX getline() , y luego procesar la cadena resultante con sscanf() . Esto facilita la notificación de errores y la recuperación de errores. Vea también Cómo usar sscanf() en bucles .

Ya que está haciendo esta pregunta que es realmente fácil, supongo que usted es un principiante en la progtwigción de C. Entonces, en lugar de tratar de dividir la entrada en sí misma durante la entrada, que parece ser un poco demasiado complicada para alguien que es nuevo en la progtwigción de C, sugeriría algo más simple (no eficiente cuando se toma en cuenta la memoria).

Solo acepta toda la entrada como una cadena. Luego revise la cadena internamente para verificar si hay dígitos y alfabetos. He usado valores ASCII de ellos para verificar. Si encuentra un alfabeto seguido de un dígito, imprima la parte de la cadena desde la última ocurrencia hasta el punto actual. Y mientras imprime esto, haga lo mismo con solo un pequeño ajuste con la subparte extraída, es decir, en lugar de verificar el número seguido de la letra, verifique la letra seguida del dígito, y en ese punto imprima tantos espacios como sea necesario.

sólo para que sepas:

Valor ASCII de dígitos (0-9) => 48 a 57

Valor ASCII del alfabeto en mayúsculas (AZ) => 65 a 90
Valor ASCII de alfabetos en minúsculas (az) => 97 a 122

Aquí está el código:

 #include #include int main() { char s[100]; int i, len, j, k = 0, x; printf("\nenter the string:"); scanf("%s",s); len = strlen(s); for(i = 0; i < len; i++){ if(((int)s[i]>=48)&&((int)s[i]<=57)) { if((((int)s[i+1]>=65)&&((int)s[i+1]<=90))||(((int)s[i+1]>=97)&&((int)s[i+1]<=122))||(i==len-1)) { for(j = k; j < i+1; j++) { if(((int)s[j]>=48)&&((int)s[j]<=57)) { if((((int)s[j-1]>=65)&&((int)s[j-1]<=90))||(((int)s[j-1]>=97)&&((int)s[j-1]<=122))) { printf("\t"); } } printf("%c",s[j]); } printf("\n"); k = i + 1; } } } return(0); } 

La salida:

Introduzca la cadena: car1900food2900ram800

coche 1900

comida 2900

ram 800

Además de usar una clase de caracteres para incluir los caracteres para leer como una cadena, también puede usar la clase de caracteres para excluir dígitos que le permitirían avanzar en la cadena hasta que se encuentre el siguiente dígito, tomando todos los caracteres como su nombre y luego leyendo los dígitos como un entero. Luego, puede determinar la cantidad de caracteres consumidos hasta el momento utilizando el especificador de formato "%n" y usar la cantidad resultante de caracteres para compensar su próxima lectura dentro de la línea, por ejemplo

  char namax[MAXNM], *p = buf; int hargax, off = 0; while (sscanf (p, "%24[^0-9]%d%n", namax, &hargax, &off) == 2) { printf ("%-24s %d\n", namax, hargax); p += off; } 

Observe cómo la cadena de formato sscanf leerá hasta 24 caracteres que no son dígitos como namax y luego el entero que sigue como hargax almacenando el número de caracteres consumidos en off que luego se aplican al puntero p para avanzar dentro del búfer en preparación para su próximo análisis con sscanf .

Poniéndolo todo en un breve ejemplo, podrías hacer:

 #include  #define MAXNM 25 #define MAXC 1024 int main (void) { char buf[MAXC] = ""; while (fgets (buf, MAXC, stdin)) { char namax[MAXNM], *p = buf; int hargax, off = 0; while (sscanf (p, "%24[^0-9]%d%n", namax, &hargax, &off) == 2) { printf ("%-24s %d\n", namax, hargax); p += off; } } } 

Ejemplo de uso / salida

 $ echo "car1900food2900ram800" | ./bin/fgetssscanf car 1900 food 2900 ram 800