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.
#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 .
Sobra un paréntesis en el for, la variable szBuffer no existe... Como quieres que funcione si ni compila?
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:
#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
#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 ;
}
}
/* 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
Vamos a ver:
#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:
void copiar()
{
char const* szBuffer1 = "mi cadena es esta";
string copia1(szBuffer1);
string copia2(szBuffer1);
}
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
y porque el char* de origen no puede ser constante?
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);
}
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
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 ?
//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
Estan trabajando con punteros indefinidos:
char *szRet;
char *szCopia;
Hay que asignarle un valor llamando a malloc o a new.
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 :'(
memset no reserva memoria, malloc la reserva pero no la inicializa, calloc la reserva y inicializa a 0.
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.
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.
Stakewinner00 fue mal formulada mi pregunta disculpa !!
Peregring-lk eso es lo que me pasa
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).
int cantidadDigitos= string.length();
for (int i=1; i <= cantidadDigitos;cantidadDigitos++)
{
despues depende pero, cantidadDigitos[i];
}
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)?
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.
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
use malloc pero al final me dio lo mismo estoy leyendo para instruirme a ver si algo sale , posterare resultados. gracias !!
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.
claro q si