Pagina 1 di 1
[Risolto][C] inserimento parola in una frase
Inviato: mercoledì 20 maggio 2015, 21:01
da gila75
Scusate il titolo, non ci sarebbe stata tutta la spiegazione.
Stavo facendo dei lavori con le stringhe, e con strstr() per la ricerca delle occorrenze.
se per esempio ho la frase:
voglio cercare e sostituire:
con una parola più lunga, corta o uguale es (citroen):
Logicamente devo muovere tutta la stringa: allargarla o diminuirla.
Ora senza scomodare magari librerie particolari, mi domandavo se questo metodo potrebbe andare bene:
Codice: Seleziona tutto
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
char origin [100]="la mia fiat è rossa è una fiat sportiva";
char word [100]="fiat";
char new_word [100]="fata";
char temp [100];
char *found;
char *p=origin;
int len;
len=strlen(word);
while (*p!='\0')
{
found=strstr(p, word);
if (found==NULL)
break;
p=found+len;
strncat (temp,new_word,strlen(new_word));
strncat (temp,p,strlen(p));
origin[found-origin]='\0';
strncat (origin,temp,strlen(temp));
temp[0]='\0';
}
printf ("%s\n", origin);
return 0;
}
oppure usare memmove&company.
è solo un prototipo, non ho usato funzioni visto che sono 2 righe.
Secondo voi è prestazionalmente penoso o può andare?
Re: [C] inserimento parola in una frase
Inviato: mercoledì 20 maggio 2015, 21:16
da develop
Secondo me sarebbe meglio utilizzare le funzioni!
Se hai funzioni (e classi per chi lavora in OO, quasi tutti ormai) meglio utilizzarle subito, sopratutto quando il tuo programma raggiunge centinaia e centinaia di righe di codice.
Re: [C] inserimento parola in una frase
Inviato: mercoledì 20 maggio 2015, 21:44
da gila75
Secondo me sarebbe meglio utilizzare le funzioni!
certo ma sono due righe di codice, logicamente in un programma va messo in una funzione e non nel main.
Però il punto era un'altro
Non ci sono funzioni specifiche in C che fanno qule meccanismo (che io conosca almeno) e mi domandavo se fosse perlomeno accettabile il mio esempio.
Re: [C] inserimento parola in una frase
Inviato: mercoledì 20 maggio 2015, 22:34
da develop
Si, per me l'esempio è accettabile, semplice e snello!

Re: [C] inserimento parola in una frase
Inviato: mercoledì 20 maggio 2015, 22:42
da gila75
Si, per me l'esempio è accettabile, semplice e snello!

Grazie

. Tempo fa parlavo con qualche utente qui, non ricordo, e forse proponeva tecniche più avanzate. A me sembra andare bene.
Che tu sappia conosci funzioni particolari? A me non risulta.
Re: [C] inserimento parola in una frase
Inviato: mercoledì 20 maggio 2015, 23:20
da develop
Al momento no, è da molto tempo che non lavoro più con C/C++.
Secondo me si dovrebbe partire da piccole cose... Si magari ti crei una funzione che esiste già, ma sicuramente apprendi molto di più facendo piccole cose semplici, poi pian piano migliori le tue doti.
Re: [C] inserimento parola in una frase
Inviato: giovedì 21 maggio 2015, 19:37
da vbextreme
se hai abbastanza spazio nella stringa la puoi inserire:
Codice: Seleziona tutto
if ( (f = strstr(from,find)) )
{
int lf = strlen(find);
int lr = strlen(replace);
memove( f + lr, f + lf, (strlen(f) - lr)+1);
}
l'ho scritto al phone quindi non ci metterei la mano sul fuoco....
vai su easystring la funzione str_ins() dovrebbe fare proprio quello.
Re: [C] inserimento parola in una frase
Inviato: giovedì 21 maggio 2015, 20:05
da gila75
sospettavo anche io l'uso di memmove/memcopy. Però ho optato per strcat.
Ora guardo.
Grazie Vb
Re: [C] inserimento parola in una frase
Inviato: giovedì 21 maggio 2015, 21:36
da gila75
@develop:
Così è decisamente meglio
Codice: Seleziona tutto
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 500
void input_char (char str_input[],int n);
void ins_word (char origin[],char word[],char new_word[]);
void input_char(char str_input[],int n)
{
int len;
fgets(str_input,n,stdin);
len=strlen(str_input);
str_input[len-1]='\0';
}
void ins_word (char origin[],char word[],char new_word[])
{
char *found;
char *p=origin;
char temp[N];
int len;
len=strlen(word);
while (*p!='\0')
{
found=strstr(p, word);
if (found==NULL)
break;
p=found+len;
strncat (temp,new_word,strlen(new_word));
strncat (temp,p,strlen(p));
origin[found-origin]='\0';
strncat (origin,temp,strlen(temp));
temp[0]='\0';
}
}
int main(void)
{
char origin [N];
char word [N];
char new_word [N];
printf ("input frase : ");
input_char(origin,N);
printf ("parola/frase da cercare : ");
input_char(word,N);
printf ("nuova parola/frase da inserire: ");
input_char(new_word,N);
ins_word(origin,word,new_word);
printf ("%s\n", origin);
return 0;
}
Peccato però che la ricerca non sia insensitive, e non mi va per ora di usare funzioni non standard.
Per strcmp() l'implementazione insensitive è piuttosto semplice, ma per strstr un po' meno se non la trasformazione temporanea delle due stringhe in tolower(),
ma mi sembra un po' macchinosa
Re: [C] inserimento parola in una frase
Inviato: giovedì 21 maggio 2015, 22:55
da develop
gila75 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4760463#p4760463][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:@develop:
Così è decisamente meglio
Codice: Seleziona tutto
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 500
void input_char (char str_input[],int n);
void ins_word (char origin[],char word[],char new_word[]);
void input_char(char str_input[],int n)
{
int len;
fgets(str_input,n,stdin);
len=strlen(str_input);
str_input[len-1]='\0';
}
void ins_word (char origin[],char word[],char new_word[])
{
char *found;
char *p=origin;
char temp[N];
int len;
len=strlen(word);
while (*p!='\0')
{
found=strstr(p, word);
if (found==NULL)
break;
p=found+len;
strncat (temp,new_word,strlen(new_word));
strncat (temp,p,strlen(p));
origin[found-origin]='\0';
strncat (origin,temp,strlen(temp));
temp[0]='\0';
}
}
int main(void)
{
char origin [N];
char word [N];
char new_word [N];
printf ("input frase : ");
input_char(origin,N);
printf ("parola/frase da cercare : ");
input_char(word,N);
printf ("nuova parola/frase da inserire: ");
input_char(new_word,N);
ins_word(origin,word,new_word);
printf ("%s\n", origin);
return 0;
}
Peccato però che la ricerca non sia insensitive, e non mi va per ora di usare funzioni non standard.
Per strcmp() l'implementazione insensitive è piuttosto semplice, ma per strstr un po' meno se non la trasformazione temporanea delle due stringhe in tolower(),
ma mi sembra un po' macchinosa
Concordo!