Go Down

Topic: cortar cadenas (Read 2289 times) previous topic - next topic

riscking

Estoy intentando separar una cadena de texto por cada salto de linea y luego una vez separada que cada linea forme parte de un array, pero solo he conseguido cortar la primera linea y esque no se como poner para q corte la primera y luego la segunda por separado, seguro q es una chorradilla pero llevo desde ayer y avanzo lentisimo ya q me esta costando aprender c.

Code: [Select]

texto ="Esto\n es una \n prueba";
 int indice=0;
 int existe=0;
 char cadena[80];
while (indice < strlen(texto)&&existe!=1)
   {
   cadena[indice]=texto[indice];
    if(texto[indice]=='\n'){
     existe=1;
     }else{
         indice++;}
       
}


Un saludo y gracias.

ToloBCN

#1
Oct 15, 2010, 08:51 pm Last Edit: Oct 15, 2010, 11:43 pm by ToloBCN Reason: 1
Se me ocurre que puedas hacer un array de punteros al inicio de las cadenas y el final como sabemos que es un ´\n´ pues sobreescribimos un 0.

Code: [Select]
char *puntero[10];
byte n= 0;
byte m = 1;
puntero[0] = cadena; // el primer puntero está claro :)
while(cadena[n]) // hasta que termine
{
 if(cadena[n] == ´\n´)
 {
  cadena[n] = 0; // sustituyo salto de linea por fin
  puntero[m] = &cadena[n+1]; // puntero al principio de la cadena
  m++
 }
 n++;
}


Editado.

riscking

Lo he conseguido de esta manera:
Code: [Select]

*puntero[10];
byte y=0;
char *t1;
for ( t1 = strtok(texto,"\n");
     t1 != NULL;
     t1 = strtok(NULL, "\n") ){
   puntero[y]=t1;
   y++;  
}


De tal forma que tengo *puntero[0], *puntero[1] y *puntero [2] cada uno con una linea pero ahora tengo el problema que el caracter \n sigue al final de cada linea y no se como quitarlo y me gustaria convertir los punteros en char.

Un saludo y gracias por la ayuda de la manera que habias dicho no me acababa de salir.

ToloBCN

#3
Oct 15, 2010, 11:42 pm Last Edit: Oct 15, 2010, 11:45 pm by ToloBCN Reason: 1
puntero[m] = &cadena[n+1]; // puntero al principio de la cadena




Creo que el fallo era este (n+1), sino el puntero apuntaba a una cadena nula.

Otra cosa que debes tener en cuenta es que ´\n´es un único carácter, no debes ponerlo entre comillas.

riscking

Tienes razon con los "" no me ahbia dado cuenta es mas al poner comillas ya tenia errores, he probao tu codigo y ya lo he hecho funcionar con algunos arreglillos

Quedaria algo asi, he intentado de laa forma que haces tu para abreviar codigo sacar tb la primera linea pero me daba problemas.
Code: [Select]

char texto ="Esto\n es una \n prueba";
int indice=0;
 int existe=0;
 char cadena[80];
int contador=0;
while (indice < strlen(texto)&&existe!=1)
   {
   cadena[indice]=texto[indice];
    if(texto[indice]=='\n'){
     existe=1;
     }else{
         indice++;}
       
}
cadena[indice-1] = '\0';
char *puntero[10];
puntero[0]=cadena;
byte b= 0;
byte m = 1;
while(texto[b]) // hasta que termine
{
 if(texto[b] == '\n')
 {
  texto[b-1] = '\0'; // En vez de 0 resto uno y quito el salto
  puntero[m] = &texto[b+1]; // puntero al principio de la cadena
  m++;
 }
 b++;
}


Ahora tengo el problema tb de antes q tengo q pasar a una funcion para mostrarlo en un LCD en un array pero en forma de char cada linea, como podria hacerlo?
Gracias de nuevo.


curro92

Las comillas en
t1 = strtok(texto,"\n");
están bien, porque el segundo parámetro de strtok() es una cadena char de separadores, que en ese caso es uno solo, pero para extraer las palabras de un texto podría ser, por ejemplo:

t1 = strtok(texto,"\n \t/()!?,;%");


Pofenas

Cuando he visto el titulo "cortar cadenas", en un primer momento lo he entendido desde el punto de vista socio-político... ya sabéis, un alegato por la libertad. El segundo momento ha sido más surrealista, cuando he intentado establecer una relación con un foro de electrónica, concretamente con este foro... entonces decidí abrir el hilo y leerlo, y ha sido un alivio!!

ToloBCN

A ver si te gusta este (en Borland C++):

Code: [Select]
#include "stdio.h"
#include "conio.h"
void main()
{
 char n, n2, m;
 char cadena[] = "esto es la primera\nla segunda\n\n la cuarta";
 char *puntero[10];

 puntero[0] = cadena; // el primer puntero está claro :)
 n = 0;
 m = 1;
 while(cadena[n]) // hasta que termine
 {
   if(cadena[n] == '\n')
   {
    cadena[n] = 0; // sustituyo salto de linea por fin
    puntero[m] = &cadena[n+1]; // puntero al principio de la cadena
    m++;
   }
   n++;
 }
 // Separado por lineas
 for(n = 0; n < m; n++)
   printf("%s#", puntero[n]);

 // Caracteres individuales
 printf("\n");

 for(n = 0; n < m; n++)
 {
   n2= 0;
   while(*(puntero[n]+n2))
   {
     printf("(%c)", *(puntero[n]+n2));
     n2++;
   }
   printf("\n");
 }
 getch();
}



riscking

Acoplandolo para lo que yo queria al final me ha quedado perfecto, mejor de lo q esperaba, muchas gracias a todos por hecharme un cable, da gusto pedir ayuda en esta comunidad.

Un saludo.

Go Up