Problema en gcc

Er_Cheru

Wenas, tenía un pequeño problema en un programa que estoy haciendo en gcc que parece simple pero no doy con la respuesta...La cuestión es la siguiente:

gets(comando);
char parametros = (char) malloc(1024*sizeof(char));
[...]
if (isalnum(comando)){
while(comando!=(int)' ' && comando!=0){
parametros[p]=comando;
i++;p++;
}
printf("El parametro es %s\n",parametros);
}

El problema es que al imprimir "parametros" solo se me imprimen los 7 primeros caracteres, y no sé a que es debido...dad por hecho que el 8º caracter no es ni el fin de "comando" ni un espacio...alguien me puede aclarar esto?? Gracias

LOc0

¿i y p dónde las inicializas?

Yo usaría un bucle do-while en vez del while para asegurate de que copias el caracter de fin de cadena '\0'

Salu2 ;)

Er_Cheru

Voy a explicar 1 poco mas el programa para que sea mas entendible. Digamos que en el gets(comando) hay 1 cadena muy larga de tokens separados por espacios. El uso del strtok no me convenció y decidí hacerlo un poco más "sucio" :D...el caso es que dependiendo del 1º caracter de cada token, este sera introducido en un char * u otro (si es un alfanumerico se mete en parametros). Asi que el "i" será el indice que va recorriendo "comando" y "p" será el indice que recorre "parametros" y ya está inicializado previamente. El printf lo he cambiado de sitio para cerciorarme de que pongo el "0" de fin de lectura:

gets(comando);
char parametros = (char) malloc(1024*sizeof(char));
[...]
if (isalnum(comando)){
while(comando!=(int)' ' && comando!=0){
parametros[p]=comando;
i++;p++;
}
parametros[p]=0;
printf("El parametro es %s\n",parametros);
}

El fallo sigue estando, claramente...y es al copiar el 8º caracter...el programa no casca pero no me sirve tener el parametro a medias...una pena que no me maneje con el gdb :S
Gracias por contestar ;)

Poisonous

No se si estoy entendiendo muy bien lo que quieres hacer. ¿pq usas una "i" y una "p"?

Si es lo que yo creo podrias hacer un bucle
for hasta el strlen del comando

for ( i = 0; i < strlen (comando); i++)
parametros = comando;

Er_Cheru

Utilizando solo un indice tendria un problema mas gordo. A ver si con un ejemplo practico se entiende mejor:

gets(comando); //Introducimos la cadena: cd directorio -r

Se pueden ver claramente 3 tokens diferenciados. El 1º por ser el 1º va a ser el comando a ejecutar por lo que lo intoduzco en un char* llamado "ejecutar". Despues de hacer esto el indice "i" apunta a la "d" de directorio. Llegariamos a la fase de comprobaciones del comando. Si es un alfanumerico entra en el char *parametros y entonces entrariamos en el codigo antes reflejado:

if (isalnum(comando)){
while(comando!=(int)' ' && comando!=0){
parametros[p]=comando;
i++;p++;
}
parametros[p]=0;
printf("El parametro es %s\n",parametros);
}

"p" es 0 (totalmente diferente a "i" que en este caso sería 3) así pues hasta que no recorra entera la palabra "directorio" no debería dejar de copiar y almacenar en "parametros". Pero esto no se da!! ya que a la hora de imprimir en este caso me imprime "directo"
Me explique bien?? gracias por intentar ayudarme ;)

Er_Cheru

Na dejadlo...la verdad es que estoy flipando 1 poco con esto del gcc xD despues de poner "cd directorio" me dijo que el parametro era "directori"...y acto seguido puse algo del estilo: cd quecoñomestascontando y me ha salido todo ese chorizo como parámetro asique desisto...esto hace lo que le da la puta gana xD gracias por intentar ayudarme y si alguien sabe a que fin hace esto...soy todo ojos

B

char = int (presupongo que comando es int pq lo igualas con un casting al espacio en blanco), puede dar problemas de interpretar lo que le da la gana xD, haz un casting o pon directamente comando como char tb.

prueba algo sencillo, un for con todos los caracteres de comando, a ver si los tiene todos.

JuAn4k4

El primero con strtoks, el segundo corrigiendo lo que tenias y al final recomendaciones tras leer lo que quieres hacer.

char* pt;
char param[100];
char copia[1024];
int i=0;

strcpy(copia,comando); // strtok chafa la cadena

pt = strtok(copia, " ");
strcpy(param, pt);
i++;
printf("ejecutar  : %s \n", pt);

while ( pt = strtok(NULL," ") != NULL )
  {
  /* ... aqui tienes pt = parametro */
  i++;
  printf("parametro %d : %s \n",i, pt);
  }

Corrigiendo lo que tu tienes hecho, creo que el "if" de mirar si es alfanumerico deberia ir dentro del bucle :

gets(comando);
char parametros = (char) malloc(1024*sizeof(char));
[...]
if (isalnum(comando)){
while(comando!=(int)' ' && comando!=0){
parametros[p]=comando;
i++;p++;
}
parametros[p]=0;
printf("El parametro es %s\n",parametros);
}

->

gets(comando);
char *parametros = (char*) malloc(1024*sizeof(char));
[...]
i=0;
p=0;
while((comando[i]!=' ') && (comando[i]!='\0')){
  if (isalnum(comando[i])){
    parametros[p]=comando[i];
    p++;
  }
i++;
}
parametros[p]='\0'; 
printf("El parametro es %s\n",parametros);
}

Editado:

A ver, tu trocito de codigo solo coje un parametrito, lo logico seria cojerlos todos y almacenarlos en un "argv" , o lo que es lo mismo un vector de cadenas :
char argt[10][100];
// 10 parametros maximo de 100 caracteres de largo ( por ej ).

y meter los parametros en esa variable, en el codigo de arriba de los que he puesto, seria cambiar:
/* ... aqui tienes pt = parametro */
por
strcpy(argt, pt);

Ademas en "ejecutar" meterias el que va justo encima del bucle, espero que te haya servido de ayuda.

Usuarios habituales