Problema al recorrer cadena

Iniciado por Joe Fraddy, 7 Octubre 2016, 17:47 PM

0 Miembros y 1 Visitante están viendo este tema.

Joe Fraddy

Ho amigos, estoy intentando recorrer una cadena, o mas bien por lo pronto acceder a sus valores y no logro hacerlo, si acceso directamente poniendo un %c me deja pero a la hora de comprara valores no funciona.

#include <stdio.h>
#include <string.h>

int main() {

char tecla[5] = "AEIOU";
char vo[1];

printf("Una vocal mayuscula: ");
scanf("%s",vo);

printf("%c\n",tecla[3] );  /* Lo hace correctamente */

printf("Esto esta %s\n",(strcmp(tecla[3],vo) == 0) ? "BIEN" : "MAL"); /* No es capaz de leer el dato */

return 0;
}


Saludos!!!

do-while

Esta parte está mal:

scanf("%s",vo);


vo solo puede contener un caracter. No has declarado espacio suficiente para almacenar el caracter \0 que indica el final de la cadena. Tienes que modificar las declaraciones teniendo ésto en cuenta.
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Joe Fraddy

Aun si le dira mas espacio, así:

char vo[5];

me marcar error, de hecho me marca este warring al compilar:

pruebas.c:16: warning: assignment makes pointer from integer without a cast

Es lo que no detecto, que podrá ser.

do-while

XD

No lo había visto, me había quedado con el error anterior. Estas utilizando tecla[3], que es un caracter, cuando strcmp espera dos punteros a caracter (o cadenas=punteros a un espacio de memoria de posiciones consecutivas delimitado por el caracter nulo '\0').
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Joe Fraddy

Entonces, disculpando mi ignorancia, como debería quedar la variable para que pueda compararla????

Saludos!!!!

MAFUS

Cometes bastantes fallos.

1. Tecla tiene un tamaño menor al que en verdad usa. Has reservado 5 bytes pero las cadenas tienen un byte más, el '\0' que marca el fin de cadena, por tanto deberías haber declarado tecla[6] o simplemente tecla[] pues si se define con una cadena C automáticamente reserva memoria.

2. Creas un array de chars con la intención de convertirlo en una cadena cuándo sólo quienes obtener un carácter.
Una cadena tiene, al menos 1 carácter, el nulo '\0' que marca fin de cadena.
Si tu intención es crear una cadena con 1 caracter válido debes reservar una memoria de 2 carácteres: uno para el carácter y otro para el carácter nulo.

3. Recoges una cadena de tamaño arbitrario mediante scanf("%s", vo);. Al hacer esto puedes cargar una cadena muy larga en vo y va a sobrepasar a la memoria que has pedido para la variable, por lo que se escribirá una parte de la memoria de la que no se tiene control. Puede pasar cualquier cosa, hasta que tu ordenador entre en internet, hackee un silo de misiles nucleares e inicie la tercera guerra mundial.
Para solventar eso haz que scanf tan solo tome 1 único carácter con scanf("%1s", vo);.

4. strcmp espera que se le pasen dos punteros que apunten a una cadena. Cuando tu pasas como argumento tecla[3] en realidad le estás pasando lo que hay en la cuarta posición de la cadena tecla, que es el caracter O. Como un carácter internamente es un valor numérico strcmp tomará ese valor numérico identificándolo como la dirección de inicio de una cadena. Seguro que el programa te va a fallar porqué el S.O. verá que esa posición de memoria no pertenece al segmento de tu programa y para evitar males mayores lo va a abortar.

Joe Fraddy

Perfecto, y entonces como debe quedar?

algún ejemplo??

MAFUS

Antes de ticar código, dime.

De lo que te hemos puesto ¿qué has entendido?
A lo mejor te contestas a ti mismo y sabes terminar el programa.

Joe Fraddy

Si, ya entendí todo, es muy básico, lo único que no entiendo es como acomodar los parámetros a strcmp, ya que si le paso el valor a una variable, no lo toma, e igual si se trato de añadir el carácter nulo, no lo hace, mi duda aquí entonces es como funciona strcmp(par1,par2)

Saludos!!