[Risolto][C] inserimento parola in una frase

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

[Risolto][C] inserimento parola in una frase

Messaggio 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:

Codice: Seleziona tutto

"la mia fiat è rossa è una fiat sportiva"
voglio cercare e sostituire:

Codice: Seleziona tutto

"fiat"
con una parola più lunga, corta o uguale es (citroen):

Codice: Seleziona tutto

"la mia citroen è rossa è una citroen sportiva"
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?
Ultima modifica di gila75 il martedì 26 maggio 2015, 7:07, modificato 2 volte in totale.
Avatar utente
develop
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 274
Iscrizione: giovedì 19 maggio 2011, 22:42
Desktop: kde-plasma
Distribuzione: Ubuntu 14.04.3 LTS x86_64
Sesso: Maschile
Località: Brescia, Italy
Contatti:

Re: [C] inserimento parola in una frase

Messaggio 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.
Develop :ciao:
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [C] inserimento parola in una frase

Messaggio 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.
Avatar utente
develop
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 274
Iscrizione: giovedì 19 maggio 2011, 22:42
Desktop: kde-plasma
Distribuzione: Ubuntu 14.04.3 LTS x86_64
Sesso: Maschile
Località: Brescia, Italy
Contatti:

Re: [C] inserimento parola in una frase

Messaggio da develop »

gila75 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4760062#p4760062][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:
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.
Si, per me l'esempio è accettabile, semplice e snello! :ciao:
Develop :ciao:
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [C] inserimento parola in una frase

Messaggio da gila75 »

Si, per me l'esempio è accettabile, semplice e snello! :ciao:
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.
Avatar utente
develop
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 274
Iscrizione: giovedì 19 maggio 2011, 22:42
Desktop: kde-plasma
Distribuzione: Ubuntu 14.04.3 LTS x86_64
Sesso: Maschile
Località: Brescia, Italy
Contatti:

Re: [C] inserimento parola in una frase

Messaggio da develop »

gila75 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4760103#p4760103][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:
Si, per me l'esempio è accettabile, semplice e snello! :ciao:
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.
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.
Develop :ciao:
Avatar utente
vbextreme
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1214
Iscrizione: domenica 12 gennaio 2014, 14:06
Desktop: lxde
Distribuzione: xubuntu 14.10

Re: [C] inserimento parola in una frase

Messaggio 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.
Easy framework per il linguaggio C.
vbextreme hack your life
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [C] inserimento parola in una frase

Messaggio da gila75 »

sospettavo anche io l'uso di memmove/memcopy. Però ho optato per strcat.
Ora guardo.
Grazie Vb
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [C] inserimento parola in una frase

Messaggio da gila75 »

@develop:

Così è decisamente meglio :D

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
Avatar utente
develop
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 274
Iscrizione: giovedì 19 maggio 2011, 22:42
Desktop: kde-plasma
Distribuzione: Ubuntu 14.04.3 LTS x86_64
Sesso: Maschile
Località: Brescia, Italy
Contatti:

Re: [C] inserimento parola in una frase

Messaggio 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 :D

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!
Develop :ciao:
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti