Domingo 15 de Diciembre de 2024, 14:47
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Tratamiento De Cadenas: Help
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Tratamiento De Cadenas: Help (Leído 1943 veces)
Jevi
Miembro activo
Mensajes: 41
Tratamiento De Cadenas: Help
«
en:
Martes 1 de Junio de 2004, 16:22 »
0
Hola, hace bastante poco que programo en C, y parece que los vícios de otros lenguajes que uso me estan haciendo más difícil el aprendizaje, así que necesito un poco de ayuda:
Estoy haciendo un programilla que lee una configuración de unos ficheros y rellena una matriz multidimensional de 200x200 con símbolos. Básicamente en un fichero hay un código de identificación y una posición X,Y para la matriz, y en el otro fichero hay la simbología de cada código.
Al leer el código en el 1er fichero leo del otro fichero el símbolo que tiene ese código y entonces ubico el símbolo en la posición X,Y. Al final me tiene que quedar una matriz pintada con símbolos.
El problema lo tengo cuando quiero saber que código he leído. En pseudocódigo sería así:
Leer línea fichero (ejemplo formato del fichero 1=COD1;12,23)
Si cod_identif = "COD1"
wsimbolo = 'X'
matriz[12][23] = wsimbolo
Si cod_identif = "COD2"
wsimbolo = 'Z'
... etc.
evidentemente esto lo haría con un case :-) Pero lo que no sé es como hacer un substring de las primeras 4 posiciones de cada línea del fichero, para poder compararlo en el if.
Gracias por cualquier ayudita. Un cordial saludo.
Tweet
El software es como el sexo, es mejor cuando es gratis. (Linus Torvalds)
nicokiki
Miembro MUY activo
Mensajes: 298
Re: Tratamiento De Cadenas: Help
«
Respuesta #1 en:
Martes 1 de Junio de 2004, 16:44 »
0
Hola!!!!!!
Si vos tenes algo asi como 20 codigos distintos tu idea estaria bien. Podrias usar el strstr(cadena original, cadena a comparar) q dice si la cadena a comparar esta dentro de la original. Ahora, si tenes infinitos codigos, no se si seria una buena idea el uso de un switch() (el case como en Pascal no existe, aca se llama Switch y es algo asi:
Código: Text
switch(opcion)
{
case 'a': algo(); break;
case 'b': algodistinto(); break;
default: otracosa(); break;
};
Espero q haya servido
Salu2!!!!!!
Jevi
Miembro activo
Mensajes: 41
Re: Tratamiento De Cadenas: Help
«
Respuesta #2 en:
Martes 1 de Junio de 2004, 17:39 »
0
Gracias nicokiki por la rapidísima respuesta
He utilizado el strstr y me funciona, pero aun se me plantea otra duda.
Mi registro de entrada es:
COD1{12,23;25,35;45,75;12,11,45,15}
COD2{45,88;45,36;44,10}
Estas son las posiciones X,Y en la matriz para los COD1 y COD2 que tendrá el simbolo # y & respectivamente. Como ves pueden tener longitud variable.
Con tu ayuda y el strstr ya soy capaz de detectar que línea he leído, pero ahora tengo que leer las coordenadas.
En principio he pensado en montar un bucle, para patearme la línia, caracter a caracter y así leer cada coordenada. Sería algo así:
Código: Text
Para el COD1
for (i=0;i<50;i++){
si caracter leído [i] es 0,1,2,3,4,5,6,7,8 ó 9
leer hasta la siguiente , y almacenar número en variable wpos_x
leer hasta la siguiente; y almacenar número en variable wpos_y
matriz[wpos_x][wpos_y] = #
}
¿qué te parece? ¿hay alguna manera mejor? Gracias
El software es como el sexo, es mejor cuando es gratis. (Linus Torvalds)
nicokiki
Miembro MUY activo
Mensajes: 298
Re: Tratamiento De Cadenas: Help
«
Respuesta #3 en:
Martes 1 de Junio de 2004, 17:58 »
0
Hola!!!!!!!!
Yo creo q con eso deberias estar bien, pero te recomiendo esto:
Como vos trabajas con registros de longitud variable, al comienzo de cada registro podrias reservar 2 bytes (unsigned short) para guardar la longitud del registro y asi sabrias lo q tendrias q levantar en el buffer. Algo asi:
COD1| Longitud Registro |12,23;25,35;45,75;12,11,45,15|
COD2| Longitud Registro |14,31;12,26|
............
Entonces, luego de haber levantado la linea entera del archivo con un fgets() y metido en un buffer, verificas q codigo tiene la linea, y luego salteas el lugar donde esta reservado COD1 y geteas la longitud del registro asi:
memcpy(Longitud, Buffer, 2 ); // 2 = tamaño en bytes del unsigned short
//(supuestamente!!!!!!!)
Y luego cargas en un buffer auxiliar la cadena hasta la longitud de lo q obtuviste:
unsigned short Long = (unsigned short)atoi(Longitud);
memcpy(BufferAux, Buffer, Long); //Tene en cuenta q Buffer tiene toda la linea, y deberias haber salteado los primeros bytes q contienen el COD? y la longitud. Ese proceso te lo dejo a vos.
Todo esto lo hice porque vos hiciste un for de 50 corridas y sin saber lo q tenias en el registro, y si hicieras mas de lo q tenes verdaderamente podrias estar usando memoria de otra cosa o si hicieras menos, no obtendrias todos los datos. No se, es una idea q te doy, la cual no es muy facil pero si se q es optima.
Salu2!!!!!!!!
Jevi
Miembro activo
Mensajes: 41
Re: Tratamiento De Cadenas: Help
«
Respuesta #4 en:
Miércoles 2 de Junio de 2004, 11:42 »
0
Nicokiki,
la verdad es que no he pillao mucho lo que me explicas
Mi nivel de C no me da pa tanto.
al final he hecho esto
Código: Text
char w_linia50[50];
char w_linia05[5];
fgets(w_linia50, 51, arxiu_pl);
strncpy(w_linia05, w_linia50, 4);
w_linia05[4]='\0';
printf("La linia50 es: %s\n",w_linia50);
printf("La linia05 es: %s\n",w_linia05);
pero el if no me devuelve nada
Código: Text
if (w_linia05=="MT10")
printf("Cadena MT10 ok\n");
El software es como el sexo, es mejor cuando es gratis. (Linus Torvalds)
nicokiki
Miembro MUY activo
Mensajes: 298
Re: Tratamiento De Cadenas: Help
«
Respuesta #5 en:
Miércoles 2 de Junio de 2004, 15:17 »
0
Hola de nuevo!!!!!!
Código: Text
if (w_linia05=="MT10")
printf("Cadena MT10 ok\n");
El == no funciona para el char*. Es por eso q no entra al "if". Ahi tenes q usar el strcmp() asi:
Código: Text
if (strcmp(w_linia05, "MT10") == 0)
printf("Cadena MT10 ok\n");
Salu2!!!!!!!
Jevi
Miembro activo
Mensajes: 41
Re: Tratamiento De Cadenas: Help
«
Respuesta #6 en:
Miércoles 2 de Junio de 2004, 16:22 »
0
Citar
El == no funciona para el char*. Es por eso q no entra al "if". Ahi tenes q usar el strcmp()
Leches, esto si que es nuevo para mí
Me tendré que hacer con un buen libro o manual de C, porque veo que tengo bastantes lagunas
Nicokiki, muchas gracias por toda tu ayuda tan aclaratoria. Ahora que ya tengo estoy solucionado, me tengo que pelear con estructuras. Creo que postearé algún mensaje más por aquí
porque no me acaba de funcionar.
Un cordial saludo Nicokiki.
El software es como el sexo, es mejor cuando es gratis. (Linus Torvalds)
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Tratamiento De Cadenas: Help