Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: bash en 23 Mayo 2015, 04:53 AM

Título: copiar caracteres uno a uno
Publicado por: bash en 23 Mayo 2015, 04:53 AM
Buenas a todos !!

tengo una duda , tengo un par de horas tratando de hacer algo con un string es quiero copiar caracter a caracter usando varoas funciones pero nada de funcionar le pondre lo que he hecho.
Código (cpp) [Seleccionar]



#include<cstdlib>
#include<cstring>
#include<iostream>

using namespace std;

void copiar(){
   char *szBuffer1 = "mi cadena es esta ";
   char *szCopia;
  char  caracterAcaracter[30];
   
   ///la plataforma en la que lo uso no tiene malloc
  memset(szCopia, 0x00, strlen(szBuffer1));


    for(int i = strlen(szBuffer1)); i < -1 ; i--)
      {

       caracterAcaracter[i] = szBuffer[1];
      strcat(szCopia, szBuffer1[i]);
     strcpy(szCopia, szBuffer1[i]); ///igual pasa con los que piden n caracateres para cpiar
                                                   /// no me deja por que el segundo argumento pide const char *
                                                   ///strtok no se bien si alguien me aconseja si me conviene                                               
}





}











podrian darme algun consejo o decirme donde podria leer mas sobre lo string y caracteres , gracias y discuplen la molestia .
Título: Re: copiar caracteres uno a uno
Publicado por: Stakewinner00 en 23 Mayo 2015, 11:14 AM
Sobra un paréntesis en el for, la variable szBuffer no existe... Como quieres que funcione si ni compila?
Título: Re: copiar caracteres uno a uno
Publicado por: bash en 23 Mayo 2015, 12:41 PM
fue un error digintandolo aqui , ayer tenia sueno, lol , pero de todos modos cuando trato de usar strcpy o strcat me da u error ya que el dato no es constante ,y uso el indice para copiar el programa estalla !!

tambien estoy  he intentando esto:
Código (cpp) [Seleccionar]

#include<cstring>
#include<iostream>
#include<stdlib.h>
#include<ctime>
using namespace std;


int main(){
   
 char *szBuffer ={"est buffer es enorme y solo quiero<aqui> cargar una parte del "};
   int inlen = 0;
   while(strstr(szBuffer, "<aqui>")!=NULL){
     inlen++;
  }


  char *szif;
 
  for(int i = 0 ; i < inlen; i++ )
  {
      memset(szif, szBuffer[i], inlen);
     cout << szif[i]<<endl ;
   }  


}





y tambien intente este

Código (cpp) [Seleccionar]
#include<cstring>
#include<iostream>
#include<stdlib.h>
#include<ctime>
using namespace std;


int main(){
   
 char *szBuffer ={"est buffer es enorme y solo quiero<aqui> cargar una parte del "};
   int inlen = 0;
 char *xc = strtok(szBuffer, " ");
   while(strtok(xc, " ")!=NULL){
     inlen++;
  }


  char *szif;
 
  for(int i = 0 ; i < inlen; i++ )
  {
      memset(szif, szBuffer[i], inlen);
     cout << szif[i]<<endl ;
   }  


}



Código (cpp) [Seleccionar]
/* strtok example */
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int main ()
{
  char str[] ="- caracter de ejemplo buscado espacios.";
  char *szBuffer;
  memset(szBuffer, 0x0, 2000 );
  char *pch = strtok(str, " ");
  while(pch != NULL)
  {
    strcat(szBuffer, pch);
    strcat(szBuffer, "\n");
    pch= strtok(NULL, " ");
    cout <<szBuffer <<endl;
   
  }
  return 0;
}


como podria usar memset en puntero de dos dimensiones !!
y me da core dmped

y que inclui ctime lo pueden obviar por favor :)


y como dije anteriormente strcpy , strncpy, strcat , strncat solo aceptan el segundo argumento const  char * y la verdad seguire intentandolo ,gracias

gracias
Título: Re: copiar caracteres uno a uno
Publicado por: Peregring-lk en 23 Mayo 2015, 15:46 PM
Vamos a ver:

Código (cpp) [Seleccionar]

#include <cstring>
#include <iostream>
#include <stdlib.h>
#include <ctime>

using namespace std;

void copiar() {
  char const *szBuffer1 = "mi cadena es esta"; // No necesitas un espacio al final. Ya hay un \0 implícito.
  char *szCopia;
  char  caracterAcaracter[30];

  // la plataforma en la que lo uso no tiene malloc.
  memset(szCopia, 0x00, strlen(szBuffer1));

  strcpy(szCopia, szBuffer1);
  strcpy(caracterAcaracter, szBuffer1);
}


Ésto debería funcionarte. La función `strcpy` recorre la segunda cadena carácter a carácter, hasta que encuentra un '\0', y la va copiando en la primera.

Lo que me gustaría saber es para qué quieres la variable `szCopia` si después no la devuelves. Por otro lado, si trabajas con C++, podrías hacer sencillamente:

Código (cpp) [Seleccionar]

void copiar()
{
    char const* szBuffer1 = "mi cadena es esta";
    string copia1(szBuffer1);
    string copia2(szBuffer1);
}

Título: Re: copiar caracteres uno a uno
Publicado por: bash en 23 Mayo 2015, 16:46 PM
tienes razon con c++ podria ser mas facil , pero tengo que usar c y estoy limitado ne recurso por eso quiero saber si alguien me da un pequeno tip , he intentado pero todo  ha sido en vano , no pongo todo el codigo pero creeme  todo esos bufferes tienen motivo de estar ahi , quiero parsear un xml y solo quiero obtener una subcadena o quiero "chop" y solo sacar una parte por que a donde la voy a pasar (dispositivo empotrado ) tiene poca memoria y quiero recortar a ver si pueder reducir el tamano , lo digo para dar mas info de lo que quiero hacer.

ahora estoy pensando cortar palabra por palabra , me recomienda usar strtok  con un puntero de dos dimensiones ? tengo el tamano maximo de caracteres que quiero capturar "


por cierto strcpy () es strcpy(char * c, const char * dd);
el compilador me da un error cuando trato de compilar con una buffer o char * no constante , es lo mismo con strcat y derivados de ellos .

Gracias
Título: Re: copiar caracteres uno a uno
Publicado por: Stakewinner00 en 23 Mayo 2015, 17:19 PM
y porque el char* de origen no puede ser constante?
Título: Re: copiar caracteres uno a uno
Publicado por: Peregring-lk en 23 Mayo 2015, 17:51 PM
Perdón, perdón. Fallo mío. Los literales de cadena ("cadena"), tiene tipo `const char*` por defecto. Me equivoqué escribiendo aquí (ya está corregido).

Y si estás programando en C, programa en C y no incluyas cabeceras de C++, etc:


#include <string.h>
   
void copiar() {
   char const *szBuffer1 = "mi cadena es esta"; // No necesitas un espacio al final. Ya hay un \0 implícito.
   char *szCopia;
   char  caracterAcaracter[30];
   
   // la plataforma en la que lo uso no tiene malloc.
   memset(szCopia, 0x00, strlen(szBuffer1));
   
   strcpy(szCopia, szBuffer1);
   strcpy(caracterAcaracter, szBuffer1);
}
Título: Re: copiar caracteres uno a uno
Publicado por: bash en 23 Mayo 2015, 18:08 PM
Bueno es c y un c++ recortado !! jajajaja

gracias ,  aunque lo que quiero es por ejemplo   

strcpy(caracterAcaracter, szBuffer1[1]); por ejemplo jajajja si es dificil
Título: Re: copiar caracteres uno a uno
Publicado por: bash en 23 Mayo 2015, 19:06 PM
estaba viendo de un tema pasado sobre caracteres y cadena en c


estoy probando algo de c++ aunque no me han aprobado en el trabajo para hablar ahora por que el programa estalla ?
Código (cpp) [Seleccionar]
//this is cpu intesive function
char *szDropToken(char * szBufferCompleto){

  string szBuffer[2000];
      int len= strlen(szBufferCompleto);
      int inlen = 0;
      char *szRet;


     
      while( len >inlen  )
      {
      char *pch =strtok( szBufferCompleto , " ");
      while(NULL, " "){
      pch =  strtok(NULL, " ");
      szBuffer[len] = pch;

      if(strstr(szBuffer[inlen].c_str(), "<ArhivoTransacciones>") == NULL )
      {
      inlen++;
     
      continue;
      }else break;

      }

      for(int i; i < inlen ; i++)
      {

              strcat(szRet, szBuffer[i].c_str());

      }
   retunr szRet;
      }


aun explota el programa
Título: Re: copiar caracteres uno a uno
Publicado por: Eternal Idol en 23 Mayo 2015, 19:12 PM
Estan trabajando con punteros indefinidos:
char *szRet;
char *szCopia;

Hay que asignarle un valor llamando a malloc o a new.
Título: Re: copiar caracteres uno a uno
Publicado por: bash en 23 Mayo 2015, 19:16 PM
y si uso memset estaria correcto ?  la mayoria de codigo que me entregaron aqui inicializa los punteros con eso , el codigo es c++ pero no puedo usar new y me dijeron que me olvide de malloc q no funciona  :'(
Título: Re: copiar caracteres uno a uno
Publicado por: Stakewinner00 en 23 Mayo 2015, 19:23 PM
memset no reserva memoria, malloc la reserva pero no la inicializa, calloc la reserva y inicializa a 0.
Título: Re: copiar caracteres uno a uno
Publicado por: Peregring-lk en 23 Mayo 2015, 20:32 PM
Stackewinner, el puntero debe ser constante por que el estándar lo dice, punto. No puedes modificar una cadena de bajo nivel. Punto.

Ahora, ¿por qué el estándar es tan tajante? ¿Por qué tantos "puntos"? Bueno, tiene un motivo relacionado con cómo se implementan tales cadenas.

Un ejecutable, cuando se coloca en memoria, está divido en varias secciones: una es la sección de código (la famosa `.text` en ensamblador), que es donde va el código de la aplicación. Luego dispone de una pila (variables locales, el stack), y un montículo (variables dinámicas -malloc y demás, el heap). Luego hay dos secciones más (que no recuerdo sus nombres), donde van las variables globales inicializadas, y otra donde van las variables globales sin inicializar. El lugar donde van las variables globales sin inicializar es una sección que se inicializa a cero al comenzar el programa (o al menos en Linux; creo que si un SO dado no se divide en tales secciones, el compilador está obligado a inicializar a cero dichas variables globales para emular el comportamiento).

Y por último, está la sección `.rodata`. Ahí es donde van todas las variables globales constantes, y los literales de cadena (es decir, toda cadena de bajo nivel que escribas en tu código fuente irá a esa sección). Si intentas modificar dicha sección (dado que es constante), a través de un puntero por ejemplo, se producirá segmentation fault y el programa se cerrará.

Y por ese motivo, las cadenas son constantes por defecto (`char const*`), porque no se pueden modificar, al estar dentro de la sección constante de tu programa, y que está protegida por el sistema operativo. Si intentas hacerte el listo y modificarlas sí o sí:


char const* str = "cadena de bajo nivel";
void* str_void = str;
char* str = (char*)str_void;
str[1] = 'A';


Ocurrirá lo que he dicho antes, segmentation fault.
Título: Re: copiar caracteres uno a uno
Publicado por: Stakewinner00 en 23 Mayo 2015, 21:06 PM
Le pregunte eso porque el había declarado "char*" en vez de "const char*" y luego dijo
Citarel compilador me da un error cuando trato de compilar con una buffer o char * no constante
pero no preguntaba por nada especial...

Entendiste mal, bueno, no pasa nada.
Título: Re: copiar caracteres uno a uno
Publicado por: bash en 23 Mayo 2015, 22:31 PM
Stakewinner00 fue mal formulada mi pregunta disculpa !!

Peregring-lk eso es lo que me pasa
Título: Re: copiar caracteres uno a uno
Publicado por: Peregring-lk en 23 Mayo 2015, 23:02 PM
Perdón Stackewinner0. De todas formas, pensé que era "el autor de éste hilo" (en éste caso bash) quién había hecho esa pregunta (no me fijo mucho en quién es quién la verdad).
Título: Re: copiar caracteres uno a uno
Publicado por: Mario Olivera en 24 Mayo 2015, 01:03 AM
Código (cpp) [Seleccionar]
int cantidadDigitos= string.length();

for (int i=1; i <= cantidadDigitos;cantidadDigitos++)
{
   despues depende pero, cantidadDigitos[i];
}
Título: Re: copiar caracteres uno a uno
Publicado por: bash en 24 Mayo 2015, 06:23 AM
me imagino que no es posible con tan limitadas opciones pero me imagino que en otro contexto se podra , ejejeej gracias aprendi algo

la verdad me esta gustando mas esto

una pregunta del mismo tema que ocuparia cada caracter (tamano)?
Título: Re: copiar caracteres uno a uno
Publicado por: Peregring-lk en 24 Mayo 2015, 06:57 AM
sizeof(char) == 1. El estándar no dice que ésto signifique un byte: para el estándar, un `char`es la unidad mínima de memoria, y por defecto `sizeof(char) == 1`, y cualquier otro tipo se mide en X veces un char. Así, `sizeof(int) == 4` significa que un `int` ocupa lo mismo que 4 `char`s (`char[4]`).

Cuánto ocupe en bytes un `char`se deja a mano del compilador, pero es universalmente 1 y no te vas a encontrar un contraejemplo.
Título: Re: copiar caracteres uno a uno
Publicado por: Eternal Idol en 24 Mayo 2015, 13:09 PM
Cita de: bash en 23 Mayo 2015, 19:16 PM
y si uso memset estaria correcto ?  la mayoria de codigo que me entregaron aqui inicializa los punteros con eso , el codigo es c++ pero no puedo usar new y me dijeron que me olvide de malloc q no funciona  :'(

No, es incorrecto, si tu puntero es indefinido y se lo pasas a memset lo que estas haciendo es escribir en una direccion indefinida, por eso tu programa genera excepciones no controladas. Usa la pila aunque eso de que malloc no funciona es un delirio ...

Un buen compilador como VC++ genera una advertencia:
d:\src\malo.cpp(10) : warning C4700: uninitialized local variable 'szCopia' used
Título: Re: copiar caracteres uno a uno
Publicado por: bash en 24 Mayo 2015, 18:00 PM
use malloc pero al final me dio lo mismo estoy leyendo para instruirme a ver si algo sale , posterare resultados. gracias !!
Título: Re: copiar caracteres uno a uno
Publicado por: Eternal Idol en 24 Mayo 2015, 19:53 PM
Cita de: bash en 24 Mayo 2015, 18:00 PM
use malloc pero al final me dio lo mismo estoy leyendo para instruirme a ver si algo sale , posterare resultados. gracias !!

Puede haber mas errores en el resto del codigo que estas compilando ahora, lo mejor que podes hacer es depurarlo.
Título: Re: copiar caracteres uno a uno
Publicado por: bash en 26 Mayo 2015, 04:13 AM
claro q si