Pages: [1]   Go Down
Author Topic: cortar cadenas  (Read 2060 times)
0 Members and 1 Guest are viewing this topic.
Orduña- Bizkaia
Offline Offline
Sr. Member
****
Karma: 0
Posts: 317
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 45
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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.
« Last Edit: October 15, 2010, 04:43:32 pm by ToloBCN » Logged

Orduña- Bizkaia
Offline Offline
Sr. Member
****
Karma: 0
Posts: 317
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Lo he conseguido de esta manera:
Code:
*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.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 45
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: October 15, 2010, 04:45:36 pm by ToloBCN » Logged

Orduña- Bizkaia
Offline Offline
Sr. Member
****
Karma: 0
Posts: 317
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

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.

Logged

Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 727
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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/()!?,;%");

Logged

Albacete
Offline Offline
Full Member
***
Karma: 0
Posts: 140
Arduino mola que te pasas
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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!!
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 45
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
#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();
}

Logged

Orduña- Bizkaia
Offline Offline
Sr. Member
****
Karma: 0
Posts: 317
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Pages: [1]   Go Up
Jump to: