Problema con cadenas en C (facilita xD)

Urien

Bueno tengo ke hacer un ahorcado (tipica practica de C), el problema es que no soy capaz de sacar una tonteria que juraria haber hecho miles de veces.

Ya tengo todo el programa hecho pero se me ha ocurrido hacer un modo vs CPU, para ello uso la funcion rand() que me devuelve un numero aleatorio para ke dentro de un switch elija una de las palabras (pal) a adivinar y comience el juego.

 opcion=rand()%11;
 switch(opcion){
        case 0:
             pal="mesa";
             break;
        case 1:
             pal="cuchara";
             break;
        case 2:
             pal="merienda";
             break;
        case 3:
             pal="rata";
             break;
        case 4:
             pal="horrendo";
             break;
        case 5:
             pal="libro";
             break;
        case 6:
             pal="movil";
             break;
        case 7:
             pal="pared";
             break;
        case 8:
             pal="pantalla";
             break;
        case 9:
             pal="silla";
             break;
        case 10:
             pal="gato";
             break;
        }

El problema es que al asignar el tipo char pal a una cadena el dev c++ me dice ke son tipos incompatibles... o.O
Dios seguro ke es cualkier tonteria pero he hecho miles de declaraciones de cadenas poniendo char palabra="teclado"; o eso creia yo...

cabron

En C no existe ningún tipo de datos para las cadenas, las cadenas son arrays char.

kas

char[] pal;

Esto no te funciona?

cabron

#2 Los arrays no se declarán así en C. Sería:

char *pal;

o

char pal[10];

Survivor

te digo lo mismo q #4 usa char *palabra o char palabra[10]

;)

Urien

Si si, ya se ke en C no existe una clase String y todo eso, el problema es ke al hacer una simple asignacion me dice ke son tipos incompatibles... asique supongo ke no se asigna de esa manera pero juraria haberlo hecho así en programas de C.

Es decir el problema viene porque yo hago:

char pal[20];
pal="tutialapela";

y eso me lo pone como conflicto de tipos.

Alx

1º con cadenas usa strcpy.
2º en vez de usar un switch tan bruto, si te creas un array de punteros a cadenas y le dices:
array[rand()%11] te ahorras tanta basura.

El problema es que tienes que ir declarando un vector de punteros y visto el nivel es jodidillo.

Lo ideal:

#define MAX 11

int i = 0;

/* Creas un array de tamaño MAX */
char * palabras[MAX];

/* Declaras memoria para los punteros /
for(i = 0; i < MAX; i++)
palabras = (char
)malloc(sizeof(MAX_PAL)*char);

/* Asignas los valores de las palabras */
strcpy(palabras[0],"pollo1");
strcpy(palabras[1],"pollo2");
...

/* La palabra elegida */
pal_cpu = palabras[rand()%MAX];

printf("%s",*pal_cpu);


Ojo! Lo he puesto de cabeza, imagino que habrá algún fallo :P. Ya lo corriges tú o nuestros amigos correctores.

Un saludo

cabron

Hombre, puestos a refinar la lógica...

char *hola[] = {"palabra 1",
"palabra 2",
"palabra 3"};

generas el número aleatorio, y luego usas:

hola[numAleatorio];

Otra cosa, ¿cómo se llama el archivo dónde tienes el código? Si se llama cpp, el compilador intentará compilarlo como código C++ en lugar de como código C, y casi seguro que por eso te da el error que dices.

Alx

No tengo claro que en C puedas hacer eso de asignar sin reservar memoria pero bueno, si quieres lo compruebo :D

Editado: Además que cosas como esas hacen que luego se te vayan a la mierda los punteros y hagan los estimados segmentation fault... nu sah, mi experiencia me dice que hay que ser estricto en C.

Viva Java!

Urien

no no, se llama ahorcado.c xD

#7 gracias por la aportacion, con ifs tambien se puede y no lo he hecho asi, mi programa es bastante cutre, eso lo ve cualquiera pero no estoy muy puesto en los punteros de arrays y en reservar memoria con malloc y la verdad es ke en nada de todo eso, asike kiero hacerlo a mi manera porke por lo menos entenderé lo ke hago.

#8 pero para hacer eso necesito un array bidimensional no? es decir char pal[20][10], los arrays de cadenas son asi ke yo me acuerde, no se.

De todas formas sigo con la misma jodida incognita, se puede o no se puede hacer palabra = "holaketal"; porke a mi no me rula :S

Alx

No se puede :D
usa strcpy que internamente va asignado caracter a caracter (y al final le pone un \0).

cabron

#9:

Es perfectamente posible hacer eso en C, y no da ningún problema de asignación de memoria.

#10:

Las asignaciones con = entre arrays char y cadenas literales, solo son posibles cuando inicializas el array, no después.

Urien

#12 vale muchas gracias, habra ke usar strcpy :/

javithelong

strcpy, strncpy, sprintf, memcpy o la que se te ocurra, pero no puedes igualar como si fueran enteros.

Cuando declaras una variable de tipo char[] si puedes igualarla a algo, y el compilador le pone el tamaño adecuado:

char pal[]="mesa";

pero luego tendrás que hacer strcpy (y ojo con los tamaños de los char[])

SeiYa

O sino, haz char * palabra;

Y luego ya te dejará hacer palabra = "mierdaconpis"

Al menos en teoría ... pero en teoría funciona hasta el comunismo.

gF

Lo que no veo claro es eso de meter las palabras dentro del mismo código fuente... es un poco noobie la verdad.

Create un archivo de texto y las vas metiendo ahí y cuando inicies el juego las lees del archivo...

TaMy

Simplemente no asignes.... utiliza el strcpy para copia una cadena a otra.

SeiYa

#19 En c no se puede hacer char * palabra = "mierdaconpis"; ?

Porque juraría que sí.

Soltrac

#20 eso si te deja, pero no te deja hacer char* palabra; y luego asignar palabra = "pepepe" pq no has reservado espacio de memoria.

javithelong

En la declaración, el compilador hace por ti el malloc necesario para meterle la palabra a lo que lo iguales.

En otros lugares del código, o tienes memoria reservada, o no puedes plantarle nada (más que nada porque "palabraAguardar" no es una dirección de memoria, y el puntero no puede apuntar ahi).

Todo tiene su lógica, otro día lo explico más detallado.

BRaDoLH

Char pal[20] sería correcto.
con Char pal, solo te guarda el primer caracter.

SeiYa

#21 tienes razón ya no me acordaba pero sabía que char * palabra = "mierda"; funcionaba, solo que de lo otro ya ...

JuAn4k4

char palabra[10] no puedes usarlo porque palabra es un puntero "fijo", que no puede ser modificado de valor vamos. ( Solo puedes cambiar el valor de lo apuntado)

mientras que : char *palabra es un puntero "variable" que puedes cambiar tanto a donde a punta como el valor de lo que apunta.

pal="asdfasdf" ; lo que hace es , colocar la cadena en memoria y despues hacer que pal apunte a ella, esto solo lo puedes hacer si has declarado pal como : char *pal;

esto es asi al menos en C. en c++ npi, aunq supongo que sera igual, esto es todo teoria.

SeiYa

#26

Ya se que eres de capacidades limitadas pero en C se puede hacer esto:

char * palabra = "el del post de arriba es más tonto que media piedra y eso que media piedra no existe porque siempre será una piedra";

Salvo el problema de los acentos que no lo mostrará correctamente, después podrás printar palabra sin ningún problema y automáticamente palabra[0] contendrá 'e' y palabra[3] contendrá 'd' etc...

Metete un dedo en el culo y hazte el muerto que te huele la espalda a pecho de hombre.

P.D: Quizás en el lenguaje de tu cabeza de error de compilación, pero en C no da ningún problema, pruébalo con el mítico TurboC que si con eso no falla ...

smintcs

lo de #28 como va, en visual c++no hay que usar librerias ni nada¿

SeiYa

#28 la ignorancia es el néctar de los necios.

Y tu debes de estar empachado ;)