cadena de caracteres

Iniciado por brayan, 24 Abril 2017, 04:16 AM

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

brayan

buenas noches amigos necesito ayuda con un codigo de c++
debo hacer la funcion buscar y reemplazar no puedo usar funciones predefinidas
me dejan usar el strlen y strcpy
no se permite variables string ni funciones que la relaciones

he intentado hacerla por tres dias y no he podido quien puede colaborarme

engel lex

muestra que llevas y especifica que es lo que te tranca
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

brayan

#2
mira lo que me piden es esto
por ejemplo el usuario ingresa"hola mundo"
ingresa una palabra a buscar"hola" y una a reemplazar "nada"
al final el programa debe mostrar "nada mundo"
pero que pasa con lo que yo eh realizado solo sirve si la palabra a reemplazar es de menor o igual tamaño a la palabra a buscar ejemplo"hola" para buscar y "nadas" para reemplazar me muestra "nada mundo"
este es el codigo
Código (cpp) [Seleccionar]
#include <iostream>
#include <string.h>
using namespace std;

int reempla(char *frase,char *palabra,char *elim,char *frase1){
int cont1=0;
int ind = 0;
int letra = 0;
int z=0;
int j=0;


for(int x=0; x<strlen(frase); x++){

if(frase[x] == '\0'){ // si esto se cumple llego al final de la oracion
break;
}

if(frase[x] == palabra[0]){
[color=red][/color]
ind = 0;

letra = 0;
for( j = x; j<x+strlen(palabra); j++){

if(frase[j] == palabra[ind]){

frase1[j]=32;
frase1[j]=elim[z];


z++;


letra++;
ind++;

}

}

if (letra == strlen(palabra)) {
cont1++;
}

}

}


return cont1;
}

int main() {

int gran=0;
char frase[500];
char frase1[500];
char palabra[50];
char elim[50];


cout<<"Ingrese la cadena de caracter: "<<endl;
fflush(stdin);
gets(frase);


for(int z=0;frase[z]!='\0';z++){
frase1[z]=frase[z];
}


cout<<"Ingrese palabra a buscar: "<<endl;
fflush(stdin);
gets(palabra);

cout<<"Ingrese palabra a reemplazar: "<<endl;
fflush(stdin);gets(elim);

reempla(frase,palabra,elim,frase1);

cout<<frase<<endl<<palabra<<endl<<elim<<endl<<frase1<<endl;

return 0;
}



· Los códigos deben ir en etiquetas GeSHi

>aquí las reglas del foro
-Engel Lex

Fedex15

Cita de: brayan en 24 Abril 2017, 04:30 AM
mira lo que me piden es esto
por ejemplo el usuario ingresa"hola mundo"
ingresa una palabra a buscar"hola" y una a reemplazar "nada"
al final el programa debe mostrar "nada mundo"
pero que pasa con lo que yo eh realizado solo sirve si la palabra a reemplazar es de menor o igual tamaño a la palabra a buscar ejemplo"hola" para buscar y "nadas" para reemplazar me muestra "nada mundo"
este es el codigo
Código (cpp) [Seleccionar]
#include <iostream>
#include <string.h>
using namespace std;

int reempla(char *frase,char *palabra,char *elim,char *frase1){
int cont1=0;
int ind = 0;
int letra = 0;
int z=0;
int j=0;


for(int x=0; x<strlen(frase); x++){

if(frase[x] == '\0'){ // si esto se cumple llego al final de la oracion
break;
}

if(frase[x] == palabra[0]){
[color=red][/color]
ind = 0;

letra = 0;
for( j = x; j<x+strlen(palabra); j++){

if(frase[j] == palabra[ind]){

frase1[j]=32;
frase1[j]=elim[z];


z++;


letra++;
ind++;

}

}

if (letra == strlen(palabra)) {
cont1++;
}

}

}


return cont1;
}

int main() {

int gran=0;
char frase[500];
char frase1[500];
char palabra[50];
char elim[50];


cout<<"Ingrese la cadena de caracter: "<<endl;
fflush(stdin);
gets(frase);


for(int z=0;frase[z]!='\0';z++){
frase1[z]=frase[z];
}


cout<<"Ingrese palabra a buscar: "<<endl;
fflush(stdin);
gets(palabra);

cout<<"Ingrese palabra a reemplazar: "<<endl;
fflush(stdin);gets(elim);

reempla(frase,palabra,elim,frase1);

cout<<frase<<endl<<palabra<<endl<<elim<<endl<<frase1<<endl;

return 0;
}



· Los códigos deben ir en etiquetas GeSHi

>aquí las reglas del foro
-Engel Lex


Hola que tal, mira, no conozco mucho de c++, yo concozco mas de c, pero te hice aca un programa que funciona como vos queres. Si tenes alguna duda me decis, no creo que sea muy dificil pasarlo a c++. Saludos


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// Verifica si la cadena find se encuentra dentro cadena. En caso de ser
// verdad devuelve 1, en caso contrario devuelve 0;

int string_contiene (char* cadena, char* find) {
size_t longCadena = strlen (cadena);
size_t longFind = strlen (find);
if (longCadena == 0) {
return 0;
}
if ((longFind > 0) && (longFind <= longCadena)) {
int count = 0;
for (int i=0; ((i<longCadena) && (count<longFind)); i++) {
count = 0;
if (cadena[i] == find[0]) {
for (; ((count<longFind) && (cadena[i] == find[count])); i++, count++);
}
}
if (count == longFind) {
return 1;
}
}
return 0;
}

// Devuelve la posicion donde comienza la cadena find en la cadena.
// Si la cadena find no se encuentra en cadena, devuelve -1.

int string_posicion (char* cadena, char* find) {
if (string_contiene (cadena, find)) {
size_t longCadena = strlen (cadena);
size_t longFind = strlen (find);
int aux, count = 0;
for (int i=0; ((i<longCadena) && (count<longFind)); i++) {
count = 0;
aux = i;
if (cadena[i] == find[0]) {
for (; ((count<longFind) && (cadena[i] == find[count])); i++, count++);
}
}
if (count == longFind) {
return aux;
}
}
return -1;
}

// Recibe una cadena, una cadena a buscar y una cadena a reemplazar.
// Si la cadena find esta en cadena, reemplaza la primera ocurrencia de find en
// cadena por la cadena str y devuelve la nueva cadena, sino, devuelve la misma
// cadena sin modificar.

char* string_reemplazar (char* cadena, char* find, char* str) {
int posicion = string_posicion (cadena, find);
if (posicion != -1) {
size_t longCadena = strlen (cadena);
size_t longFind = strlen (find);
size_t longStr = strlen (str);
if (longFind <= longStr) {
char* cadenaModificada = (char*) malloc (sizeof (char) * longCadena + (longStr - longFind) );
}
char* cadenaModificada = (char*) malloc (sizeof (char) * longCadena - (longFind - longStr) );
char* temp1 = (char*) malloc (sizeof (char) * longCadena);
char* temp2 = (char*) malloc (sizeof (char) * longCadena);
temp1[0] = '\0';
temp2[0] = '\0';
for (int i=0; i<posicion; i++){
temp1[i] = cadena[i];
temp1[i+1] = '\0';
}
for (int i=0, j=posicion+longFind; j<longCadena; i++, j++) {
temp2[i] = cadena[j];
temp2[i+1] = '\0';
}
size_t longT1 = strlen (temp1), longT2 = strlen (temp2);
strcpy (cadenaModificada, temp1);
int i=longT1;
for (int j=0; j<longStr; j++, i++){
cadenaModificada[i] = str[j];
}
for (int j=0 ;j<=longT2; j++, i++){
cadenaModificada[i] = temp2[j];
}
free (temp1);
free (temp2);
return cadenaModificada;
}
return cadena;
}

int main(){
char* cadena = (char*) malloc (sizeof (char) * 100);
char* find = (char*) malloc (sizeof (char) * 50);
char* str = (char*) malloc (sizeof (char) * 50);
printf ("Ingrese una cadena:\n");
gets (cadena);
printf ("Ingrese una palabra a buscar:\n");
gets (find);
printf ("Ingrese el reemplazo:\n");
gets (str);
cadena = string_reemplazar (cadena, find, str);
printf ("La cadena es:\n%s", cadena);
return 0;
}

MAFUS

Este último código tiene pérdida de memoria al perder la referencia a cadena. Hay que pensar que es memoria dinámica y hay que liberarla a mano.

Fedex15

#5
Cita de: MAFUS en 27 Abril 2017, 12:01 PM
Este último código tiene pérdida de memoria al perder la referencia a cadena. Hay que pensar que es memoria dinámica y hay que liberarla a mano.

Aca lo mejore un poco, ahora le paso un char** para poder modificar la original, primero liberandola y poniendo la cadena nueva. Tambien saque las cadenas temporales y lo hice directamente, las habia usado para ir dandome cuenta que tenia que hacer.



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Verifica si la cadena find se encuentra dentro cadena. En caso de ser
// verdad devuelve 1, en caso contrario devuelve 0;

int string_contiene (char* cadena, char* find) {
size_t longCadena = strlen (cadena);
size_t longFind = strlen (find);
if (longCadena == 0) {
return 0;
}
if ((longFind > 0) && (longFind <= longCadena)) {
int count = 0;
for (int i=0; ((i<longCadena) && (count<longFind)); i++) {
count = 0;
if (cadena[i] == find[0]) {
for (; ((count<longFind) && (cadena[i] == find[count])); i++, count++);
}
}
if (count == longFind) {
return 1;
}
}
return 0;
}

// Devuelve la posicion donde comienza la cadena find en la cadena.
// Si la cadena find no se encuentra en cadena, devuelve -1.

int string_posicion (char* cadena, char* find) {
if (string_contiene (cadena, find)) {
size_t longCadena = strlen (cadena);
size_t longFind = strlen (find);
int aux, count = 0;
for (int i=0; ((i<longCadena) && (count<longFind)); i++) {
count = 0;
aux = i;
if (cadena[i] == find[0]) {
for (; ((count<longFind) && (cadena[i] == find[count])); i++, count++);
}
}
if (count == longFind) {
return aux;
}
}
return -1;
}

// Recibe una cadena, una cadena a buscar y una cadena a reemplazar.
// Si la cadena find esta en cadena, reemplaza la primera ocurrencia de find en
// cadena por la cadena str y devuelve la nueva cadena, sino, devuelve la misma
// cadena sin modificar.

void string_reemplazar (char** cadena, char* find, char* str) {
int posicion = string_posicion (cadena[0], find);
if (posicion != -1) {
size_t longCadena = strlen (cadena[0]);
size_t longFind = strlen (find);
size_t longStr = strlen (str);
if (longFind <= longStr) {
char* cadenaModificada = (char*) malloc (sizeof (char) * longCadena + (longStr - longFind) );
}
char* cadenaModificada = (char*) malloc (sizeof (char) * longCadena - (longFind - longStr) );
for (int i=0; i<posicion; i++){
cadenaModificada[i] = cadena[0][i];
cadenaModificada[i+1] = '\0';
}
int j = posicion;
for (int i=0; i<longStr; j++, i++){
cadenaModificada[j] = str[i];
}
for (int i=posicion+longFind; i<longCadena; j++, i++){
cadenaModificada[j] = cadena[0][i];
}
                cadenaModificada[j] = '\0';
free (cadena[0]);
cadena[0] = cadenaModificada;
}
}

int main(){
char* cadena = (char*) malloc (sizeof (char) * 100);
char* find = (char*) malloc (sizeof (char) * 50);
char* str = (char*) malloc (sizeof (char) * 50);
printf ("Ingrese una cadena:\n");
gets (cadena);
printf ("Ingrese una palabra a buscar:\n");
gets (find);
printf ("Ingrese el reemplazo:\n");
gets (str);
string_reemplazar (&cadena, find, str);
printf ("La cadena es:\n%s", cadena);
       free(cadena);
       free(find);
       free(str);
return 0;
}