Autor Tema: Manipulacion de cadenas en C18  (Leído 3916 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Manipulacion de cadenas en C18
« en: 07 de Diciembre de 2010, 04:50:23 »
Que tal foro;

Aqui de nuevo con dudas, ahora quiero preguntarles acerca de como utilizar funciones para la manipulacion de cadenas ya que cuento con poca si no es que nula experiencia acerca del tema.

Mi duda es la siguiente:

Supongamos que tengo una variable tipo long la cual puede tener una longitud variable, esta variable la quiero convertir a string y lo hago de la siguiente forma:

Código: [Seleccionar]
unsigned long Variable;
char cadena[20];

Variable=12345;
ltoa(Variable,cadena);

Entonces quisiera saber como puedo partir la cadena para obtener cada uno de sus elementos, tomando en cuenta que la longitud de la cadena me puede variar... para despues darle el procesamiento que desee....


Saludos :)
Lo que no me destruye, me fortalece

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Manipulacion de cadenas en C18
« Respuesta #1 en: 07 de Diciembre de 2010, 09:43:19 »
La cadena se creará:

cadena[0]='1';
cadena[1]='2';
cadena[2]='3';
cadena[3]='4';
cadena[4]='5';
cadena[5]='\0';


Entonces, puede buscar el carácter nulo '\0' que indica final de string, y el anterior es la unidad, y así sucesivamente....

Ayúdate haciendo debug, con proteus o con MPLAB, ayudan mucho cuando se quiere entender algunas cosas.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Manipulacion de cadenas en C18
« Respuesta #2 en: 07 de Diciembre de 2010, 10:28:09 »
Hola, para iterar por todos los elementos deberia ser algo asi:

Código: C
  1. int i, Largo;
  2.  
  3. Largo = strlen( Cadena );
  4.  
  5. for ( i = 0; i < Largo; i ++ )
  6. {
  7.    /* Cada elemento del array se accede con el subindice i */
  8. }


Saludos !

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Manipulacion de cadenas en C18
« Respuesta #3 en: 07 de Diciembre de 2010, 14:59:22 »
A caray RICHI777, no te entendi la ultima parte jejejje

Código: [Seleccionar]
/* Cada elemento del array se accede con el subindice i */
Lo que no me destruye, me fortalece

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Manipulacion de cadenas en C18
« Respuesta #4 en: 07 de Diciembre de 2010, 15:12:14 »
Hola, para iterar por todos los elementos deberia ser algo asi:

Código: C
  1. int i, Largo;
  2. unsigned long Variable;
  3. char cadena[20];
  4.  
  5. Variable=12345;
  6. ltoa(Variable,cadena);
  7.  
  8. Largo = strlen( cadena );
  9.  
  10. for ( i = 0; i < Largo; i ++ )
  11. {
  12.    /* Cada elemento del array se accede con el subindice i */
  13.    printf( "%c", cadena[ i ] );
  14. }



Saludos !

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Manipulacion de cadenas en C18
« Respuesta #5 en: 07 de Diciembre de 2010, 15:56:49 »
A caray RICHI777, no te entendi la ultima parte jejejje

Código: [Seleccionar]
/* Cada elemento del array se accede con el subindice i */

Estudia sobre string y array de variables. O arreglo de Variables.
No contesto mensajes privados, las consultas en el foro

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Manipulacion de cadenas en C18
« Respuesta #6 en: 07 de Diciembre de 2010, 21:05:41 »
Tomando en cuenta el post de RICHI777, trate de separar individualmente los elementos de la cadena pero  creo que no obtuve el exito, ya que al hacer un debug me di cuenta que las variables se me desbordaban... o tal vez no es correcta la forma en la que lo estoy haciendo, ademas me marca un warning.....

Código: [Seleccionar]
Make: The target "C:\P_C18\LCD_SER\openuart.o" is up to date.
Make: The target "C:\P_C18\LCD_SER\readuart.o" is up to date.
Make: The target "C:\P_C18\LCD_SER\uartdata.o" is up to date.
Make: The target "C:\P_C18\LCD_SER\writuart.o" is up to date.
Make: The target "C:\P_C18\LCD_SER\getsuart.o" is up to date.
Make: The target "C:\P_C18\LCD_SER\putsuart.o" is up to date.
Make: The target "C:\P_C18\LCD_SER\lcd_serial.o" is up to date.
Make: The target "C:\P_C18\LCD_SER\LCD_SER.o" is out of date.
Executing: "C:\MCC18\bin\mcc18.exe" -p=18F4610  /i"C:\MCC18\h" "LCD_SER.c" -fo="C:\P_C18\LCD_SER\LCD_SER.o" -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
C:\P_C18\LCD_SER\LCD_SER.c:47:Warning [2054] suspicious pointer conversion
Make: The target "C:\P_C18\LCD_SER\ftoa.o" is up to date.
Make: The target "C:\P_C18\LCD_SER\LCD_SER.cof" is out of date.
Executing: "C:\MCC18\bin\mplink.exe" /l"C:\MCC18\lib" /k"C:\MCC18\bin\LKR" "C:\MCC18\lkr\18f4610.lkr" "C:\P_C18\LCD_SER\openuart.o" "C:\P_C18\LCD_SER\readuart.o" "C:\P_C18\LCD_SER\uartdata.o" "C:\P_C18\LCD_SER\writuart.o" "C:\P_C18\LCD_SER\getsuart.o" "C:\P_C18\LCD_SER\putsuart.o" "C:\P_C18\LCD_SER\lcd_serial.o" "C:\P_C18\LCD_SER\LCD_SER.o" "C:\P_C18\LCD_SER\ftoa.o" /o"C:\P_C18\LCD_SER\LCD_SER.cof" /M"C:\P_C18\LCD_SER\LCD_SER.map" /W
MPLINK 4.30.01, Linker
Copyright (c) 2009 Microchip Technology Inc.
Errors    : 0

MP2HEX 4.30.01, COFF to HEX File Converter
Copyright (c) 2009 Microchip Technology Inc.
Errors    : 0

Loaded C:\P_C18\LCD_SER\LCD_SER.cof.
BUILD SUCCEEDED: Tue Dec 07 16:57:57 2010

Código: [Seleccionar]
#include <p18f4610.h>

#include <delays.h> //Libreria para los retardos
#include <stdlib.h> //Libreria para conversiones a string
#include <stdio.h>
#include <sw_uart.h>
#include <string.h>
#include <math.h>
#include "./Include/lcd_serial.h"
#include "./Include/ftoa.h"


#pragma config OSC=HS,FCMEN=OFF,IESO=OFF
#pragma config PWRT=ON,BOREN=OFF,BORV=0,WDT=OFF,WDTPS=32768
#pragma config MCLRE=ON,LPT1OSC=OFF,PBADEN=OFF,CCP2MX=PORTBE
#pragma config STVREN=OFF,LVP=OFF,XINST=OFF,DEBUG=OFF
#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF,CPB=OFF
#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF,WRTB=OFF,WRTC=OFF
#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTR3=OFF,EBTRB=OFF

float numero,numero_x;
unsigned char numero_1,numero_2,numero_3,numero_4,Datos[20];
unsigned long num_5,num_4,num_3,num_2,num_1,numero_completo;
char cadena[20],cad[2],cadena_2[20],cadena_x[20],x[20];
unsigned int i,Largo;

void main(void)
{
ADCON1=15;
    OpenUART();

Delay_ms(200);
ClearLCD();
HomeLCD();

Datos[0]=0; Datos[1]=0; Datos[2]=0;
Datos[3]=0; Datos[4]=0; Datos[5]=0;
Datos[6]=0;

numero_completo=1234560;
ltoa(numero_completo,cadena);

Largo=strlen(cadena);

for(i=0;i<Largo;i++)
{
Datos[i]=atoi(cadena[i]);
}

Tomare en cuenta tu consejo Suky y me pondre a investigar mas sobre cadenas, aunque creo que en el compilador C18 faltan algunas funciones para el manejo de strings que ordinariamente vienen en otros compilaodres o se les ha moficado su nombre......

Saludos
Lo que no me destruye, me fortalece

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Manipulacion de cadenas en C18
« Respuesta #7 en: 07 de Diciembre de 2010, 23:04:21 »
Me puse a checar como partir una cadena en cada uno de sus elementos..... y encontre una funcion llamada "substr" (Substring), la cual va adquiriendo cada uno de los caracteres a partir de su posicion. Pero C18 no cuenta con ella, entonces queria saber si hay alguna funcion parecida en c18 que me realice lo mismo....

Saludos
Lo que no me destruye, me fortalece

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Manipulacion de cadenas en C18
« Respuesta #8 en: 09 de Diciembre de 2010, 14:13:26 »
Que tal;

Cual es la forma correcta de realizar una funcion que me devuelva una cadena tipo char....


Porque he estado intentando y no me sale


Saludos
Lo que no me destruye, me fortalece

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Manipulacion de cadenas en C18
« Respuesta #9 en: 09 de Diciembre de 2010, 14:52:36 »
En mi codigo estoy haciendo algo asi:

Código: [Seleccionar]
strcpy(Cad->Cientos,NULL);
Cientos(Digitos[2],Cad->Cientos,Digitos[1],Digitos[0]);

e hice una funcion de esta manera:

Código: [Seleccionar]
char *Cientos(unsigned char Digito,char *cadena,unsigned char Digito_1,unsigned char Digito_2)
{
char cad[20];

strcpy(cadena,NULL);
strcpy(cad,NULL);

switch(Digito)
{
case 1:
if((Digito_1==0)&&(Digito_2==0))
{
cad[0]='C';cad[1]='I';cad[2]='E';cad[3]='N';
}
else
{
cad[0]='C';cad[1]='I';cad[2]='E';cad[3]='N';cad[4]='T';cad[5]='O';
}
break;
case 2:
cad[0]='D';cad[1]='O';cad[2]='S';cad[3]='C';cad[4]='I';cad[5]='E';cad[6]='N';cad[7]='T';cad[8]='O';cad[9]='S';
break;
case 3:
cad[0]='T';cad[1]='R';cad[2]='E';cad[3]='S';cad[4]='C';cad[5]='I';cad[6]='E';cad[7]='N';cad[8]='T';cad[9]='O';cad[10]='S';
break;
case 4:
cad[0]='C';cad[1]='U';cad[2]='A';cad[3]='T';cad[4]='R';cad[5]='O';cad[6]='C';cad[7]='I';cad[8]='E';cad[9]='N';cad[10]='T';cad[11]='O';cad[12]='S';
break;
case 5:
cad[0]='Q';cad[1]='U';cad[2]='I';cad[3]='N';cad[4]='I';cad[5]='E';cad[6]='N';cad[7]='T';cad[8]='O';cad[9]='S';
break;
case 6:
cad[0]='S';cad[1]='E';cad[2]='I';cad[3]='S';cad[4]='C';cad[5]='I';cad[6]='E';cad[7]='N';cad[8]='T';cad[9]='O';cad[10]='S';
break;
case 7:
cad[0]='S';cad[1]='E';cad[2]='T';cad[3]='E';cad[4]='C';cad[5]='I';cad[6]='E';cad[7]='N';cad[8]='T';cad[9]='O';cad[10]='S';
break;
case 8:
cad[0]='O';cad[1]='C';cad[2]='H';cad[3]='O';cad[4]='C';cad[5]='I';cad[6]='E';cad[7]='N';cad[8]='T';cad[9]='O';cad[10]='S';
break;
case 9:
cad[0]='N';cad[1]='O';cad[2]='V';cad[3]='E';cad[4]='C';cad[5]='I';cad[6]='E';cad[7]='N';cad[8]='T';cad[9]='O';cad[10]='S';
break;
}

strcat(cadena,cad);
return cadena;
}

Me imprime lo que le pido y aparte me arroja algo de basura... alguien tiene idea de porque me pasa eso...

Saludos
Lo que no me destruye, me fortalece


 

anything