Barra espaciadora en C

Er_Cheru

Hola gentes. Tenía un problema en un programilla que estoy haciendo...el caso es que obtengo con el gets un char* el cual son varias palabras separadas con el espacio de toda la vida y a la hora de intentar separar la 1ª palabra utilizando un while no se a que comparar el caracter del char*...He probado "",' ', incluso el ascii de la barra espaciadora pero no doy con ello...alguien me puede ayudar?? Espero haberme explicado bien...gracias ;)

SicKneSs

"" es la ristra nula

" " es el espacio

Er_Cheru

Pues debo cometer algún fallo tonto que no veo xD
while(comandoEnt!=" "){
comando=comandoEnt;
i++;
}
Entra en el while y no sale nunca...por lo que deduzco que no identifica el " " como la barra espaciadora...gracias por tu ayuda

kas

Cuando asignas el valor " " a la matriz comandoEnt?

Er_Cheru

char comandoEnt =(char) malloc(0);
char comando = (char) malloc(0);

[...]

do{
printf("P:/>");
gets(comandoEnt);
tamano = strlen (comandoEnt);

for(i = 0; i < tamano ; i++){
while(comandoEnt!=" "){
comando=comandoEnt;
i++;
}

[...]

En el gets introduzco 2 palabras separadas ya que mi programa tiene que leer comandos (la 1º palabra) con sus respectivos parámetros separados por espacios.

JuAn4k4

Edit ( Tras leer el codigo )
Usa
char* strtok(char* cadena,const char* separador)

tal que asi:
primerComando = strtok( cadenaACortar, " ");

y llamadas posteriores:
siguienteComando = strtok(NULL," ");

OJO! strtok te jode la cadena que le pasas, y si haces uno y despues uno distinto ya no puedes volver a la cadena inicial porque la has perdido. ( nose si me explico ).


Haz un programa tal que asi:

char c;
c = ' ';
printf( "%d", (int)c ) ;

miras el numerito que te da y luego la comparacion la haces tal que:
xxx es el numero que te pinta por la pantalla el primer programita.

#define SPACE xxx
[...]
(int)comandoEnt != SPACE


De todas formas, el espacio deberia ser:

if ( (int) comandoEnt != (int)' ' ){..}


PD: Si usas el primero tb puedes pedir la cadena y pintar los numeros en un bucle.

Er_Cheru

Gracias JuAn4k4 el espacio es eso que dices....lo del strtok lo había visto en algún lado y la verdad es que del todo no lo entiendo...no llevo demasiado con C así que a ser posible de momento lo esquivo :D gracias ;)

JuAn4k4

Te explico un poco como va el strtok, que es bastante util.

Por ejemplo tenemos la cadena:

Paco-Manuel-Pepin-Manolin-Pedobear-

Bien si quiero cojer los nombres haria esto:

#define NAME_LEN 100
#define NUM_NOMBRES 10
...
  char* ptr;
  char nombres[NUM_NOMBRES][NAME_LEN];
  int n_nombres;
  char separador[2];
  char auxiliar[512]; 
  char cadena[512];
    
strcpy(cadena,"Paco-Manuel-Pepin-Manolin-Pedobear-"); // Hago copia para que no me chafe la informacion de la cadena ( No haria falta si no hace falta reutilizarla ). strcpy(auxiliar,cadena); strcpy(separador, "-"); // Numero de nombres en la cadena. n_nombres = 5; // Primer strtok ptr = strtok(cadena, "-"); /* Ahora tendremos: cadena = Paco\0Manuel-Pepin-Manolin-Pedobear- y la funcion strtok se guardara un puntero auxiliar apuntando a la "M" de Manuel. Es decir en posteriores llamadas a esta funcion con la cadena NULL empezara a partirla a partir de Manuel. // copio el contenido en una variable con los nombres strcpy(nombres[0], ptr); // Y ahora cojo los demas for ( i = 1; i< n_nombres; i++) { ptr = strtok(NULL,"-"); strcpy(nombres[i], ptr); } ..
ethernal-

Edito, cagada XDD

Sr_RoS

y por que no lo haces buscando el ASCII del espacio?

ExTiNcT_

Por lo q entiendo quieres leer palabras y q cuando llegues a un caracter q no sea una letra ( espacio, coma, punto, etc), te lo guarde como una palabra, y siga leyendo la siguiente.

Puedes poner:

letra=getchar();

while( tolower(letra) >= 'a' && tolower(letra) <= 'z')
{
//mientras sea una letra, q te haga en el while lo q tu quieras, como guardar las letras leidas y tener la palabra q buscas
}

El "tolower" es para q te lea tanto las mayusculas como las minusculas.

18 días después
WaYnE10

#3 prueba con comilla simple(' ') en vez de comilla doble (" ") en la comparacion.

NoSFeR

frikis xD

cracking

no me acuerdo bien de C, pero en el primer while q he visto comparas una cadena con != ?? las cadenas no se cmoparaban con strcmp(tuletra," "), si devuelve 0 es q son iguales, osea, es un espacio. creo vamos, para dejarse de strtok y polladas desas, saludos.

edit: #15, obviamente yo solo taba suponiendo, no he dicho q utilice SOLO esa linea de codigo, q meta esa comparacion dentro de un bucle recorriendo, como tú muy bien dices, el array, y si alguna de esas "letras" es un espacio, ergo lleva un espacio, gl :/

Rubo
  • si haces malloc(0) es normal que no funcione, porque en el caso de que el programa no casque a saber donde guarda la info (no se si me equivoco)

  • yo lo haria con scanf, para mi es mas facil y ya te hace la separación

  • para todo lo demas #6 y #8

  • #14 te recuerdo que char* es un array de caracteres, por lo que si quieres comprobar que en la cadena esta la letra x tienes que recorrerla y comprobar letra a letra, lo que tu has puesto es para comprobar si la cadena es un espacio, no si lleva un espacio

Usuarios habituales

  • Rubo
  • NoSFeR
  • WaYnE10
  • ethernal-
  • JuAn4k4
  • Er_Cheru
  • SicKneSs