Acquisire due stringhe con getchar

di il
12 risposte

Acquisire due stringhe con getchar

Ciao a tutti!

Vorrei chiedere un'informazione a voi più esperti! Devo acquisire due stringhe di caratteri, la prima stringa lunga al massimo 100 caratteri, la seconda stringa lunga al massimo 3 caratteri.

Pensavo di utilizzare la funzione
getchar
Però non riesco mai ad inserire la seconda stringa perché il programma termina prima, senza darmi la possibilità di inserire la seconda stringa.

È giusto utilizzare la funzione getchar oppure bisogna utilizzare un altro metodo?
Questo è il codice che ho scritto:

Grazie mille in anticipo!
Ciaoo

12 Risposte

  • Re: Acquisire due stringhe con getchar

    No, devi usare la fgets
  • Re: Acquisire due stringhe con getchar

    Ciao!

    Grazie per la risposta, ho provato con la fgets ma non mi funziona ancora!
    
    #include <stdio.h>
    #define dim1 10
    #define dim2 3
    
    int main ()
    {
        int i=0, l=0;
        char s1[dim1], s2[dim2], c, d;
        
        printf("Inserisci la prima sequenza di %d caratteri:\n\t", dim1);
        fgets(s1,dim1,stdin);
    
        printf("Inserisci la seconda sequenza di %d caratteri:\n\t", dim2);
        fgets(s2,dim2,stdin);
    
        printf("\n\nPrima sequenza: %s\nSeconda sequenza: %s", s1, s2);
        
        
        return 0;
    }
    
    Grazie mille
    Ciaoo!
  • Re: Acquisire due stringhe con getchar

    Viene memorizzato il tuo invio nella prima stringa.
    Per evitare ciò utilizza la funzione fflush(stdin)
    
    #include <stdio.h>
    #define dim1 10
    #define dim2 3
    
    int main ()
    {
        int i=0, l=0;
        char s1[dim1], s2[dim2], c, d;
       
        printf("Inserisci la prima sequenza di %d caratteri:\n\t", dim1);
        fgets(s1,dim1,stdin);
    
        fflush(stdin);
    
        printf("Inserisci la seconda sequenza di %d caratteri:\n\t", dim2);
        fgets(s2,dim2,stdin);
    
        printf("\n\nPrima sequenza: %s\nSeconda sequenza: %s", s1, s2);
       
       
        return 0;
    }
    
    nello spazio tra i due fgets
  • Re: Acquisire due stringhe con getchar

    Devi scrivere
    
    #define dim1 10
    #define dim2 4 
    
    int main ()
    {
        char s1[dim1+1], s2[dim2+1];
        
        printf("Inserisci la prima sequenza di %d caratteri:\n\t", dim1);
        fgets(s1,dim1+1,stdin);
    	fflush(stdin);
    
        printf("Inserisci la seconda sequenza di %d caratteri:\n\t", dim2);
        fgets(s2,dim2+1,stdin);
    	fflush(stdin);
    
        printf("\n\nPrima sequenza: %s\nSeconda sequenza: %s", s1, s2);
        
        
        return 0;
    }
    
    Se NON lavori con un compilatore Microsoft la fflush non funzionerà ... sostituiscila con un ciclo while ...
  • Re: Acquisire due stringhe con getchar

    Ciao!

    Grazie per le risposte, io sto compilando su mac, ed infatti la fflush non mi funziona
    La fflush funziona solamente se compilo su windows?

    Come posso sostituirla con il ciclo while?

    Grazie
    Ciao
  • Re: Acquisire due stringhe con getchar

    Ciao!

    Ho scoperto che il codice funzionava alla perfezione, solo che se inserisco una stringa di caratteri più lunga della dimensione definita, allora il programma si blocca e passa subito alla fine
    
    #include <stdio.h>
    #include <string.h>
    #define dim1 10
    #define dim2 3
    
    int main ()
    {
        int i=0, l=0;
        char s1[dim1], s2[dim2], c, d;
        
        printf("Inserisci la prima sequenza di %d caratteri:\n\t", dim1);
        fgets(s1,dim1,stdin);
        fflush(stdin);
        printf("Inserisci la seconda sequenza di %d caratteri:\n\t", dim2);
        fgets(s2,dim2,stdin);
    
        printf("\n\nPrima sequenza: %s\nSeconda sequenza: %s", s1, s2);
        
        
        return 0;
    }
    
    Io devo risolvere questo esercizio:

    Si sviluppi un programma in linguaggio C che, ricevendo in ingresso una sequenza S1 di 100 caratteri e una sequenza S2 di tre caratteri, calcoli quante volte la sequenza S2 compare nella sequenza S1 e stampi il risultato. (10 punti)
    Ad esempio, ricevendo in ingresso le sequenze S1: A A T A T A T D T A T A A T A T A
    S2: A T A
    produce in uscita 5.


    Sapete dirmi se esiste un codice per far si che l'utente non immetta più di 100 caratteri?

    Grazie
    Ciao
  • Re: Acquisire due stringhe con getchar

    Probabilmente la fgets() della libreria che accompagna il tuo compilatore non inserisce il terminatore di stringa quando il buffer viene riempito completamente; suggerisco di predisporre le due stringhe con un carattere in più e di settare sempre questo ultimo carattere con il terminatore di stringa, per sicurezza, come nell'esempio qui sotto:
    #include <stdio.h>
    #include <string.h>
    #define dim1 10
    #define dim2 3
    
    int main ()
    {
        int i=0, l=0;
        char s1[dim1+1], s2[dim2+1], c, d;
       
        printf("Inserisci la prima sequenza di %d caratteri:\n\t", dim1);
        fflush(stdin);
        fgets(s1,dim1+1,stdin);
    	s1[dim1] = '\0';
        
    	printf("Inserisci la seconda sequenza di %d caratteri:\n\t", dim2);
        fflush(stdin);
        fgets(s2,dim2+1,stdin);
    	s2[dim2] = '\0';
    
        printf("\n\nPrima sequenza: %s\nSeconda sequenza: %s", s1, s2);
    
        return 0;
    }
  • Re: Acquisire due stringhe con getchar

    Ma poichè hai risolto il problema con fflush(stdin) utilizza di nuovo la gets non la fgets...
    
    #include <stdio.h>
    #include <string.h>
    #define dim1 10
    #define dim2 3
    
    int main ()
    {
        int i=0, l=0;
        char s1[dim1], s2[dim2], c, d;
    
        printf("Inserisci la prima sequenza di %d caratteri:\n\t", dim1);
        gets(s1);
        fflush(stdin);
        printf("Inserisci la seconda sequenza di %d caratteri:\n\t", dim2);
        gets(s2);
    
        printf("\n\nPrima sequenza: %s\nSeconda sequenza: %s", s1, s2);
        return 0;
    }
    
    Per il tuo problema puoi utilizzare uno dei algoritmi di ricerca di un pattern in una stringa.
    Ne esistono tanti e di facile praticabilità, facendo mente locale c'è quello chiamato "naive" o ricerca sequenziale se non erro...però ne esistono tanti altri, cerca un pò in giro..
  • Re: Acquisire due stringhe con getchar

    Il punto è che la fgets() è da preferire alla semplice gets() in quanto con fgets() è possibile specificare la dimensione del buffer che viene passato.
  • Re: Acquisire due stringhe con getchar

    Ciao a tutti!
    Scusate il ritardo nella risposta, ma ho avuto dei problemi con la connessione.

    Grazie al codice di candaluar ho risolto il problema, adesso l'immissione dei caratteri funziona correttamente.

    Vorrei chiedervi solo un'informazione sul resto dell'esercizio:
    
    #include <stdio.h>
    #include <string.h>
    #define dim1 100
    #define dim2 3
    
    int main ()
    {
        int i=0, l=0, cont=0, tot1=0, tot2=0;
        char s1[dim1+1], s2[dim2+1], c, d;
           
        printf("Inserisci la prima sequenza di %d caratteri:\n\t", dim1);
            fflush(stdin);
            fgets(s1,dim1+1,stdin);
            s1[dim1] = '\0';
            
        printf("Inserisci la seconda sequenza di %d caratteri:\n\t", dim2);
            fflush(stdin);
            fgets(s2,dim2+1,stdin);
            s2[dim2] = '\0';
    
        printf("\nPrima sequenza: %sSeconda sequenza: %s", s1, s2);
            for (i=0;i<dim1;i++)
            {
                if (s1[i]!='\n')
                tot1++;
            }
            for (i=0;i<dim2;i++)
            {
                if (s2[i]!='\n')
                tot2++;
            }
        printf("\nTotale caratteri prima sequenza: %d  --  Totale caratteri seconda sequenza: %d", tot1, tot2);
        for (i=0;i<dim1-dim2;i++)
        {
            if (s1[i]==s2[i] && s1[i+1]==s2[i+1] && s1[i+2]==s2[i+2])
                cont++;
            if (s1[i]=='\n')
                break;
        }
    
        printf("\n\nIn totale la scritta: %s compare %d volte nella scritta: %s", s2, cont, s1);
        
        return 0;
    }
    Questo è il codice che ho scritto per risolvere tutto l'esercizio, però il programma sbaglia a calcolare quante volte la stringa s2 compare in s1. Ad esempio se immetto come prima stringa:
    ATATATA
    e come seconda:
    ATA
    il programma conta che ATA è stata inserita 2 volte al posto che 3. Addirittura se immetto la stringa di esempio del mio esercizio, al posto di avere come risultato 5 ho 1.

    Penso che il problema sia qui:
    
        for (i=0;i<dim1-dim2;i++)
        {
            if (s1[i]==s2[i] && s1[i+1]==s2[i+1] && s1[i+2]==s2[i+2])
                cont++;
            if (s1[i]=='\n')
                break;
        }
    
    Io ho pensato di fare un ciclo for, così controllo se ogni carattere della stringa 2 corrisponde alla stringa 1, se è così allora aumento il contatore altrimenti passo al carattere successivo.

    Come mai che non ottengo mai il risultato corretto?

    Grazie mille
    Ciaoo
  • Re: Acquisire due stringhe con getchar

    L'indice i lo puoi utilizzare sul buffer s1 mentre su s2 devi rimanere sui primi 3 elementi
    
      if (s1[i]==s2[0] && s1[i+1]==s2[1] && s1[i+2]==s2[2])
           cont++;
    
  • Re: Acquisire due stringhe con getchar

    Cavolo ecco l'errore

    Grazie mille
    Adesso funziona tutto quanto

    Grazie ancora
    Ciaoo
Devi accedere o registrarti per scrivere nel forum
12 risposte