PDA

View Full Version : [C] Programma cerca e cancella!!


darkmax
31-05-2005, 18:07
Ho fatto un programma in c che chiede una stringa, poi la sottostringa da cercare in esso e poi un'altra sottostringa che sostituisce quella di prima..

Ora però devo fare un programma che.. presa una stringa ad esempio "camino" e poi una sottostringa, ad esempio "ami", me la cancelli.. dando come risultato "cno".. come si modifica il codice?

#include <stdio.h>
#define L1 10
#define L2 10
#define SORG 30
#define VECCHIA 10
#define NUOVA 10
#define DEST 30

typedef enum{FALSO,VERO} bool;

char* sottostringa(char* p, char* s);
bool SostPrimaOcc(char* vecchia, char* nuova, char* sorg, char* dest);

int main()
{
char* ris;
char vecchia[VECCHIA], nuova[NUOVA], sorg[SORG], dest[DEST];
char stringa[L1], pattern[L2];
bool ris1;

int scelta = -1;

while (scelta != 0)
{
printf("1) sottostringa\n2) SostPrimaOcc\n0) Esci\n\nScelta: ");
scanf("%d",&scelta);

switch(scelta)
{
case 1: printf("Inserisci la stringa in cui cercare (max 10 caratteri): ");
scanf("%s",stringa);

printf("Inserisci la sottostringa da cercare (max 10 caratteri): ");
scanf("%s",pattern);

ris = sottostringa(pattern, stringa);

if (ris == NULL)
{
printf("Non ho trovato %s in %s\n\n", pattern, stringa);
}
else
{
printf("Ho trovato %s in %s\n\n", pattern, stringa);
}
break;

case 2: printf("Inserisci la stringa in cui cercare (max 30 caratteri): ");
scanf("%s",sorg);

printf("Inserisci la sottostringa da cercare (max 10 caratteri): ");
scanf("%s",vecchia);

printf("Inserisci la sottostringa da sostituire (max 10 caratteri): ");
scanf("%s",nuova);

ris1 = SostPrimaOcc (vecchia, nuova, sorg, dest);

if (ris1 == FALSO)
{
printf("Non ho trovato %s in %s. La stringa e' rimasta: %s\n\n", vecchia, sorg, dest);
}
else
{
printf("Ho trovato %s in %s. La nuova stringa e': %s\n\n", vecchia, sorg, dest);
}
break;

case 0: break;
default : printf("Scelta non valida!\n\n");
break;
}
}

getch();
}

char* sottostringa (char* p, char* s)
{
char* i = p;
char* j = s;
int ris=0;
int cont=0;
char* found=NULL;

char* k = p;

while (*k != '\0')
{
cont++;
k++;
}

while (*j != '\0')
{
while (*i != '\0')
{
if (*i == *(j+ris))
{
ris++;
if (found == NULL)
found = j;
}
else
break;
i++;
}

if (ris == cont)
{
return found;
}
else
{
ris = 0;
found = NULL;
i = p;
}
j++;
}
return NULL;
}

bool SostPrimaOcc (char* vecchia, char* nuova, char* sorg, char* dest)
{
char* ris=sottostringa(vecchia,sorg);
int j;
char* i = sorg;

if (ris != NULL)
{
int cont=0;

char* k = vecchia;

while (*k != '\0')
{
cont++;
k++;
}

k = nuova;
int cont1=0;

while (*k != '\0')
{
cont1++;
k++;
}

k = dest;

while (i != ris)
{
*k = *i;
k++;
i++;
}

for (j = 0; j < cont1; j++)
{
*k = *nuova;
k++;
nuova++;
}

i += cont;

while (*i != '\0')
{
*k = *i;
k++;
i++;
}

*k='\0';

return VERO;
}
else
{
char* dest1 = dest;

while (*i != '\0')
{
*dest1 = *i;
i++;
dest1++;
}
*dest1='\0';
}

return FALSO;
}

Help vi prego.. :cry: :cry:

Fenomeno85
31-05-2005, 18:09
se non indenti io non mi metto a guardare il codice

~§~ Sempre E Solo Lei ~§~

darkmax
31-05-2005, 18:15
ho fatto copia e incolla dal dev c++.. ma come mai non lo indenta?

darkmax
31-05-2005, 18:42
quando scrivo il messaggio me lo vede come indentato.. come mai qui no?

Gica78R
31-05-2005, 18:51
quando scrivo il messaggio me lo vede come indentato.. come mai qui no?
Prova a mettere il codice tra appositi tag 'CODE':


int main()
{
if (metti_i_tag)
indenta=1;
else
indenta=0;
return 0;
}


Per farlo basta cliccare sul cancelletto (#) che trovi nel menu nella finestra dell'editor del messaggio ;)


Ciao

darkmax
31-05-2005, 19:08
#include <stdio.h>
#define L1 10
#define L2 10
#define SORG 30
#define VECCHIA 10
#define NUOVA 10
#define DEST 30

typedef enum{FALSO,VERO} bool;

char* sottostringa(char* p, char* s);
bool SostPrimaOcc(char* vecchia, char* nuova, char* sorg, char* dest);

int main()
{
char* ris;
char vecchia[VECCHIA], nuova[NUOVA], sorg[SORG], dest[DEST];
char stringa[L1], pattern[L2];
bool ris1;

int scelta = -1;

while (scelta != 0)
{
printf("1) sottostringa\n2) SostPrimaOcc\n0) Esci\n\nScelta: ");
scanf("%d",&scelta);

switch(scelta)
{
case 1: printf("Inserisci la stringa in cui cercare (max 10 caratteri): ");
scanf("%s",stringa);

printf("Inserisci la sottostringa da cercare (max 10 caratteri): ");
scanf("%s",pattern);

ris = sottostringa(pattern, stringa);

if (ris == NULL)
{
printf("Non ho trovato %s in %s\n\n", pattern, stringa);
}
else
{
printf("Ho trovato %s in %s\n\n", pattern, stringa);
}
break;

case 2: printf("Inserisci la stringa in cui cercare (max 30 caratteri): ");
scanf("%s",sorg);

printf("Inserisci la sottostringa da cercare (max 10 caratteri): ");
scanf("%s",vecchia);

printf("Inserisci la sottostringa da sostituire (max 10 caratteri): ");
scanf("%s",nuova);

ris1 = SostPrimaOcc (vecchia, nuova, sorg, dest);

if (ris1 == FALSO)
{
printf("Non ho trovato %s in %s. La stringa e' rimasta: %s\n\n", vecchia, sorg, dest);
}
else
{
printf("Ho trovato %s in %s. La nuova stringa e': %s\n\n", vecchia, sorg, dest);
}
break;

case 0: break;
default : printf("Scelta non valida!\n\n");
break;
}
}

getch();
}

char* sottostringa (char* p, char* s)
{
char* i = p;
char* j = s;
int ris=0;
int cont=0;
char* found=NULL;

char* k = p;

while (*k != '\0')
{
cont++;
k++;
}

while (*j != '\0')
{
while (*i != '\0')
{
if (*i == *(j+ris))
{
ris++;
if (found == NULL)
found = j;
}
else
break;
i++;
}

if (ris == cont)
{
return found;
}
else
{
ris = 0;
found = NULL;
i = p;
}
j++;
}
return NULL;
}

bool SostPrimaOcc (char* vecchia, char* nuova, char* sorg, char* dest)
{
char* ris=sottostringa(vecchia,sorg);
int j;
char* i = sorg;

if (ris != NULL)
{
int cont=0;

char* k = vecchia;

while (*k != '\0')
{
cont++;
k++;
}

k = nuova;
int cont1=0;

while (*k != '\0')
{
cont1++;
k++;
}

k = dest;

while (i != ris)
{
*k = *i;
k++;
i++;
}

for (j = 0; j < cont1; j++)
{
*k = *nuova;
k++;
nuova++;
}

i += cont;

while (*i != '\0')
{
*k = *i;
k++;
i++;
}

*k='\0';

return VERO;
}
else
{
char* dest1 = dest;

while (*i != '\0')
{
*dest1 = *i;
i++;
dest1++;
}
*dest1='\0';
}

return FALSO;
}

71104
01-06-2005, 00:00
che casino ragazzo mio, che casino... bastavano 35 righe di codice:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main() {
char s1[0x400], s2[0x400];
int l1, l2;
char done = 0;
int i, max;
printf("stringa principale: ");
gets(s1);
printf("sottostringa da eliminare: ");
gets(s2);
l1 = strlen(s1);
l2 = strlen(s2);
max = l1 - l2 + 1;
for (i = 0; i < max; i++) {
if (!strncmp(s1 + i, s2, l2)) {
int j;
for (j = i; j < max; j++) {
s1[j] = s1[j + l2];
}
done = 1;
break;
}
}
if (done) {
printf("stringa risultante: %s\n", s1);
}
else {
printf("sottostringa non trovata\n");
}
system("pause");
return 0;
}

darkmax
01-06-2005, 00:14
dammi una mano allora.. :cry:

71104
01-06-2005, 00:43
il programma è quello, sta là ed è scritto in C standard :)
quel programma prende in input due stringhe, cerca la seconda nella prima e se la trova la rimuove, è quello che volevi ;)
sono solo 35 righe di codice, quindi non ci vuole molto a leggerle e capirle

darkmax
01-06-2005, 09:30
Il bello è che devo farlo con i puntatori.. :(