Ayuda en C

Buenas, tengo una duda.

Básicamente quiero crear un array con varias palabras
Código:
char* palabras[3]={"hola","adios"};
.Necesito un algoritmo que haga varias cosas:
1.Que elija al azar una de las palabras dentro de "palabras"
2.La cosa es que no se como hacer para dividir "hola" en "h", "o", "l", "a".
3.A la vez que separo las letras de una palabra, necesito ir guardándolas en un array.
También puede ser que el comando char* no sea el correcto. Entonces, cual creéis que tendría que poner para hacer lo que pido.

Todo esto que pido es para el ejercicio del juiego del ahorcado que estoy haciendo en C, y que me tiene bastante pillado.
Si utilizas char* tienes una región de la memory de solo lectura y un puntero a ella.
Podrías representarlo como una matriz de char[], por ejemplo, de esta forma char[0][1] sería la letra numero 2 de la primera palabra de la fila.
Puedes copiar directamente de la matriz al array que necesites.
Las otras opciones para trabajar con char* requieren del uso de la librería string.h, puedes consultarlas aquí.
http://es.wikipedia.org/wiki/String.h
Viciomovil escribió:Si utilizas char* tienes una región de la memory de solo lectura y un puntero a ella.
Podrías representarlo como una matriz de char[], por ejemplo, de esta forma char[0][1] sería la letra numero 2 de la primera palabra de la fila.
Puedes copiar directamente de la matriz al array que necesites.
Las otras opciones para trabajar con char* requieren del uso de la librería string.h, puedes consultarlas aquí.
http://es.wikipedia.org/wiki/String.h

Pero si quito *, al compilar me da error e.e
EDIT: Vale ahora no me da error que estaba poniendo en la y un valor muy pequeño.
Si haces una matriz de char, podrías por ejemplo escoger una fila de la matriz (un random()) para escoger una palabra y después escoger cada elemento de esa fila para sacar las letras.
Un string es en si misma un charr array. Y es posible acceder a la posición de éste.
char cadena[] = "ABCD";
printf("%c",cadena[2]);
Eso imprimiría la letra C, ¿correcto? En lugar de imprimir, manda cada char que componga esa cadena al array que tú quieres. Puedes ver la longitud de una cadena, así que puedes recorrerla de 0 a fin posición a posición para manejar cada char como quieras.
exitfor escribió:Un string es en si misma un charr array. Y es posible acceder a la posición de éste.
char cadena[] = "ABCD";
printf("%c",cadena[2]);
Eso imprimiría la letra C, ¿correcto? En lugar de imprimir, manda cada char que componga esa cadena al array que tú quieres. Puedes ver la longitud de una cadena, así que puedes recorrerla de 0 a fin posición a posición para manejar cada char como quieras.


Creo recordar (hace 12 años que no programo en C) que en tu ejemplo se puede hacer
printf("%s",cadena);

El parámetro %s imprimia las posiciones consecutivas del array hasta que encontraba un \0.

En cuanto a la longitud de la cadena, se pueden usar las funciones strlen de string.h para calcular la longitud de una cadena, siempre que esté terminada en \0.

Seleccionar la palabra es fácil.

           char *dictionary[] = {"These", "are", "some", "strings"};
           char* riddle = dictionary[rand() % 4];
     
           // Como curiosidad,
           int sizeDictionary =  sizeof(dictionary) / sizeof(char*);
           char* riddle = dictionary[rand() % sizeDictionary];


Viciomovil escribió:Si utilizas char* tienes una región de la memory de solo lectura y un puntero a ella.
Podrías representarlo como una matriz de char[], por ejemplo, de esta forma char[0][1] sería la letra numero 2 de la primera palabra de la fila.
Puedes copiar directamente de la matriz al array que necesites.
Las otras opciones para trabajar con char* requieren del uso de la librería string.h, puedes consultarlas aquí.
http://es.wikipedia.org/wiki/String.h


¿Cómo es eso de que la memoria es de sólo lectura? Si utiliza un char* está declarando un puntero, pero no está reservando memoria.

Por otra parte, el concepto de "matriz" no sería del todo acertado porque la longitud de cada palabra es más que probable que será diferente. Es más bien un array de arrays de char.

Por último, como consejo, acostúmbrate a manejar las cadenas con la notación de punteros. Siempre y cuando sepas lo que es un puntero, claro :p . Pero me da, por tus dudas, que todavía no has empezado a manejar punteros ni te han introducido al maravilloso mundo del malloc().
A ver si me acuerdo
Podrias usar el tpo ToCharArray();

convertir un String a un arreglo de caracteres.
osea haces el arreglo de las palabras, agregas doa for anidados una que separa el tamaño total del arreglo y otro que recora las palabras por separado (si faltaria como saber la longuitud de cada palabra)

despues conel metodo ToCharArray() , agregras cada palabra en un arreglo

ejemplo de esa parte
String palabra ="elotrolado";
char a[] =palabra.ToCharArray()
jam007 escribió:A ver si me acuerdo
Podrias usar el tpo ToCharArray();

convertir un String a un arreglo de caracteres.
osea haces el arreglo de las palabras, agregas doa for anidados una que separa el tamaño total del arreglo y otro que recora las palabras por separado (si faltaria como saber la longuitud de cada palabra)

despues conel metodo ToCharArray() , agregras cada palabra en un arreglo

ejemplo de esa parte
String palabra ="elotrolado";
char a[] =palabra.ToCharArray()


No existen tipos String en C, compañero.
squarewave escribió:
jam007 escribió:A ver si me acuerdo
Podrias usar el tpo ToCharArray();

convertir un String a un arreglo de caracteres.
osea haces el arreglo de las palabras, agregas doa for anidados una que separa el tamaño total del arreglo y otro que recora las palabras por separado (si faltaria como saber la longuitud de cada palabra)

despues conel metodo ToCharArray() , agregras cada palabra en un arreglo

ejemplo de esa parte
String palabra ="elotrolado";
char a[] =palabra.ToCharArray()


No existen tipos String en C, compañero.


joder si esta diciendo C [sonrisa]
squarewave escribió:
Viciomovil escribió:Si utilizas char* tienes una región de la memory de solo lectura y un puntero a ella.
Podrías representarlo como una matriz de char[], por ejemplo, de esta forma char[0][1] sería la letra numero 2 de la primera palabra de la fila.
Puedes copiar directamente de la matriz al array que necesites.
Las otras opciones para trabajar con char* requieren del uso de la librería string.h, puedes consultarlas aquí.
http://es.wikipedia.org/wiki/String.h


¿Cómo es eso de que la memoria es de sólo lectura? Si utiliza un char* está declarando un puntero, pero no está reservando memoria.

Por otra parte, el concepto de "matriz" no sería del todo acertado porque la longitud de cada palabra es más que probable que será diferente. Es más bien un array de arrays de char.

Por último, como consejo, acostúmbrate a manejar las cadenas con la notación de punteros. Siempre y cuando sepas lo que es un puntero, claro :p . Pero me da, por tus dudas, que todavía no has empezado a manejar punteros ni te han introducido al maravilloso mundo del malloc().


Me refería a esto concretamente, http://stackoverflow.com/questions/1704 ... har-s-in-c Donde creo que si no está acostubrado a trabajar con char* puede bloquearse bastante

The difference here is that

char *s = "Hello world";
will place Hello world in the read-only parts of the memory and making s a pointer to that, making any writing operation on this memory illegal. While doing:

char s[] = "Hello world";
puts the literal string in read-only memory and copies the string to newly allocated memory on the stack. Thus making

s[0] = 'J';
legal.



Y tienes mucha razón en lo de "array de arrays", ya que matriz da a pensar en algo simétrico. En mi opinión si hace el char[][] le será todo más sencillo.

¡Un saludo!

EDIT: Que no había respondido al op, podrías hacer
#include <stdio.h>

int main(void){

char string[100][100]={"Hola","Adios"};
/*Calculas el numero aleatorio para el primer valor, 0 o 1 en este caso*/
printf("%s\n",string[0]);
printf("%s\n",string[1]);
/*Si lo que necesitas es un caracter accedes a ese elemento*/
printf("%c\n",string[0][0]);

return 0;
}


Este codigo devuelve basicamente:
Hola
Adios
H
9 respuestas