Leggere input con spazi [C]

di il
9 risposte

Leggere input con spazi [C]

Salve a tutti, mi sono imbattuto in una situazione abbastanza frustrante
a me serve leggere una riga di testo in C, e con scanf se nella riga sono presenti gli spazi, viene troncata restituendo solo la prima parola.Usango fgets(str,100,stdin) non mi fa nemmeno leggere l'input che termina quando viene eseguita questa istruzione.Aiuti?come posso fare per leggere una stringa completa in C?grazie in anticipo!

9 Risposte

  • Re: Leggere input con spazi [C]

    Com'è il tuo input?
    fgets legge fino al '\n'
    Stai terminando i dati con \n ?
  • Re: Leggere input con spazi [C]

    Mi pare si possa risolvere con il gets invece dello scanf...
    solo che ad esempio a me da problemi con XCODE...
  • Re: Leggere input con spazi [C]

    Che problemi ti da con xcode?
  • Re: Leggere input con spazi [C]

    Praticamente richiedo l'inserimento di una stringa da tastiera, poi metto gets(nomestringa);
    e quando eseguo il programma salta il passaggio, praticamente non mi fa inserire la stringa, passa all'input successivo e scrive "warning: this program uses gets(), which is unsafe."
    per risolvere devo inserire 2 gets identici, uno sotto l'altro. a questo punto il primo lo salta ma attende l'input con il secondo. questo lo fa solo con il primo gets del codice, per i successivi input non è necessario ripetere quest accrocchio di operazione.
    mi hanno suggerito fgets ma richiede 3 parametri e ancora non ho capito quali inserire...
    sai come aiutarmi in qualche altro modo??
  • Re: Leggere input con spazi [C]

    Il compilatore giustamente ti dice che la gets() non è sicura, in quanto gli passi come parametro un array di 'char' senza la sua dimensione, quindi in teoria con l'input potresti 'sforare' la dimensione dell'array, invece con fgets() ciò non accade perché passi alla funzione anche un intero che indica il numero massimo di caratteri da salvare. Che ne dici di postare il codice, vorrei darci un occhiata per vedere se casomai ci fossero disambiguità
  • Re: Leggere input con spazi [C]

    Grazie vins3xtreme, ecco uno dei codici di esercizio nei quali il gets mi ha dato quel problema:
    #include <stdio.h>
    #include <string.h>
    
    
    int main (void)
    {
    
        char nome[100][20];
        int voto[100][6];
        char n[20];
        int z,i,s;
        
        
        printf("Olimpiadi\n");
        printf("Vota l'atleta e determino il più bravo\n");
        
        printf("Quanti atleti ci sono? ");
        scanf("%d",&z);
        gets(n);
        
        for (i=0;i<z;i++){
            printf("\nCome si chiama il %d° atleta?",i+1); 
            gets(n);
            strcpy(nome[i],n);
        }
        
        for (i=0;i<z;i++){
            voto[i][5]=0;
            for (s=0;s<5;s++){
                printf("Giudice %d, voto atleta %s :",s+1,nome[i]);
                scanf("%d",&voto[i][s]);
                voto[i][5]=voto[i][5]+voto[i][s];
            }
        }
        for (i=0;i<z;i++){
            printf("\nAtleta %s, totale voti: %d ", nome[i],voto[i][5]);
        }
    }
    
    qui come vedi il primo gets l'ho messo prima del ciclo for dato che per risolvere il problema era sufficiente inserirlo ripetuto una sola volta.
    ma la cosa strana è che, dopo i primi esercizi (sono alle prime armi e sto studiando ed esercitandomi passo dopo passo...) effettuati con il gets nel quale funzionava perfettamente, di punto in bianco mi ha dato questo problema. Ed i primi esercizi sono del tutto simili come difficoltà ed impostazione... ti posto ad esempio un codice dove non mi da problemi (o meglio, mi scrive il solito avviso warning.... ma cmq attende l'inserimento della stringa), in questo codice inserisco 2 stringhe e il programma cerca la seconda all'interno della prima, se la trova sostituisce i caratteri uguali con '*':
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main (void)
    {
        
        char primo[30];
        char secondo[30];
        char nuova[30];
        
        long lunghezza;
        int i,a,flag;
        a=0;
        flag=0;
        
        printf("RICERCA SOTTOSTRINGA\n");
        printf("\ninserisci la prima parola: \n");
        gets(primo);
        printf("\ninserisci la seconda parola: \n");
        gets(secondo);
        lunghezza=strlen(primo);  
        for (i=0;i<lunghezza;i++){
            nuova[i]=primo[i];
        }
        printf("\nprima la parola nuova è %s",nuova);
        if (strlen(secondo)>lunghezza){
            printf("la seconda parola deve essere più corta della prima");
            printf("\ninserisci la seconda parola: \n");
            gets(secondo);
        }
        i=0;
        while (i<lunghezza){
        for (a=0;a<strlen(secondo);a++){
            if (secondo[a]==primo[i]){
                i++;
                flag++;
                while (a<strlen(secondo)){
                    a++;
                    if (secondo[a]==primo[i] && i<lunghezza){
                        nuova[i]='*';
                        nuova[i-1]='*';
                        i++;
                        flag++;
                    }   
                    else if (secondo[a]==primo[i] && i==lunghezza){
                        nuova[i-1]='*';
                        i++;
                        flag++;
                    }
                }
            }
            else if (secondo[a]!=primo[i]){
                i++;
                a--;
            }
        }
        }    
            printf("\nLa parola vecchia è %s",primo);
            printf("\nLa parola nuova è   %s",nuova);
    }
    
    mistero della fede
  • Re: Leggere input con spazi [C]

    Toti, il problema è risolto . Se noti , nei tuoi esercizi precedenti usi la gets() senza la scanf() . Vedi, devi sapere che la scanf() lascia nel buffer dello stdin il carattere di fine riga '\n' o altri caratteri se questi 'abbondano' dall'input. Ora quando chiami la gets() esso trova già dei caratteri nel buffer, quindi prende quelli ed esce, per questo non ti viene richiesto l'input. Per risolvere il problema puoi utilizzare 'fflush(stdin)' dopo la scanf() così che svuoti il buffer prima che venga eseguita gets(), vedrai che così funziona.
  • Re: Leggere input con spazi [C]

    Quoto l'ing solo nella prima parte.
    Non condivido l'utilizzo della gets che, anche se non deprecata per retrocompatibilita', non viene accettata nei rilasci ufficiali dalle varie comunità opensource. A testimonianza i software report o security updates segnalati come Bug#.
    Altro punto che non condivido l'utilizzo della fflush su stdin che non funziona sui sistemi *nix.
  • Re: Leggere input con spazi [C]

    Grazie a tutti per l'aiuto,
    ixamit, sono a conoscenza che il gets non è il massimo, diciamo che sto impanardo tutte le strade un passo alla volta, penso che sia giusto anche conoscere funzioni che non si utilizzano molto, giusto per capire meglio quelle funzioni che invece ne hanno preso il posto... sto cercando di imparare a piccoli passi e quindi mi vedrete spesso fare domande ingenue o poco utili a molti...
    grazie mille cmq a tutti per le risposte!!
Devi accedere o registrarti per scrivere nel forum
9 risposte