Input di 100 parole stampare quante volte ognuna viene ripetuta

di il
10 risposte

Input di 100 parole stampare quante volte ognuna viene ripetuta


#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <string>
using namespace std;
int main(){
    char a [100][20];
    string b ="";
    int i =0;
    for(i=0;strcmp(a[i],"fine")!=0;i++){
        cout<<"inserisci la parola n:"<<i;
        cin>>b;
        a[i]=b;
    }
    sort(a,a+100);
    int cont=0;
    int io=0;
    while(io<i){
        cout>>a[io];
        cont=1;
        while(io<i&&strcmp(a[io],a[io+1])==0){
            cont++;
            io++;
        }
        cout<<":"<<cont<<"\n";
        io++;
    }
}
mi da uno strano errore nella dichiarazione della stringa sto sbagliando qualcosa ? se qualcuno riesce a spiegarmi e farmi capire dove sbaglio gliene sarei grato

10 Risposte

  • Re: Input di 100 parole stampare quante volte ognuna viene ripetuta

    Il primo errore che vedo è a = b;

    a è una delle righe di un array di char, mentre b è un oggetto di classe string.

    Piuttosto avresti dovuto fare una cosa tipo: strncpy( a, b.c_str(), 20 );
    Quel "20" nel terzo parametro serve per non "sfondare" il limite dei venti caratteri per riga tipico della matrice che stai usando, dichiarata come char a[100][20].

    Sicuramente ci sono altri errori.
  • Re: Input di 100 parole stampare quante volte ognuna viene ripetuta

    Ah grazie mille quel comando non lo conoscevo proprio .
    Già qualcosa un altra di cui non sono sicuro è char a[][].
    Secondo per inizializzalo come voglio io cioè 100 parole lunghezza massima 20 forse non si fa così
  • Re: Input di 100 parole stampare quante volte ognuna viene ripetuta

    Ma perché stai mischiando le stringhe del C e quelle del C++ ?
  • Re: Input di 100 parole stampare quante volte ognuna viene ripetuta

    Sarà una richiesta dell'insegnante...
    (guarda che scherzo)
  • Re: Input di 100 parole stampare quante volte ognuna viene ripetuta

    AldoBaldo ha scritto:


    Sarà una richiesta dell'insegnante...
    (guarda che scherzo)
    Penso proprio che l'insegnante non lo voglia affatto! (E non scherzo)
  • Re: Input di 100 parole stampare quante volte ognuna viene ripetuta

    In realtà vorrei fare tutto tramite char perché così è molto più "semplice" tramite le funzioni sort e compare .Solo che non so come fare a inserire all'utente la parola tramite char .
    ( con il tipo String sono riuscito a farlo ma vorrei anche capire bene come usare il tipo char )
  • Re: Input di 100 parole stampare quante volte ognuna viene ripetuta

    Se non sei tenuto a usare il C++ puoi provare col C. Io farei così...
    #include <stdio.h>
    #include <string.h>
    
    /*==============================================================================
    Riceve il puntatore a un buffer e la capacita' massima del buffer stesso.
    Attende l'inserimento da console di una stringa.
    Elimina l'eventuale '\n' in coda alla stringa immessa. Se non lo trova,
    significa che e' stata inserita una stringa troppo lunga (in quel caso occorre
    anche esaurire i caratteri "pendenti" nello stream stdin, e la stringa nel
    buffer risultera' troncata entro il limite massimo richiesto).
    Se tutto va a dovere, restituisce la lunghezza della stringa rilevata.
    In caso d'errore restituisce 0.
    P.S. il tipo size_t equivale a un unsigned int.
    ==============================================================================*/
    
    size_t chiedi_stringa( char *buff, size_t dim ) {
        if( fgets(buff,dim,stdin) ) {
            size_t l = strlen(buff);
    
            if( buff[l-1] == '\n' )
                buff[--l] = '\0';
            else while( getchar()!='\n' );
    
            return l;
        }
    
        return 0;
    }
    
    int main(){
        char a[100][20];
        int i = 0;
    
        memset( a, 0, 100*20 ); // azzera a[][]; lo uso più che altro per sfizio
    
        for( i=0; i<100; i++ ) {
            printf( "inserisci la parola n. %d: ", i+1 );
            chiedi_stringa( a[i], 20 ); // bisognerebbe verificare l'esito...
    
            if( strcmp(a[i],"fine") == 0 ) {
                memset( a[i], 0, 20 ); // se "fine" non ti serve, azzera a[i]
                break;
            }
        }
       
        return 0;
    }
    
    Non prendere per oro colato quel che scrivo, però. Leggi la firma qui sotto.
  • Re: Input di 100 parole stampare quante volte ognuna viene ripetuta

    Per avere l'input su array di char è sufficiente:
    
    cin.getline(a[i], 20);
    
    Mentre il modo più comodo di acquisire std::string è:
    
    getline(cin,b);
    
  • Re: Input di 100 parole stampare quante volte ognuna viene ripetuta

    Forte! Senza neanche saperlo ho praticamente "duplicato" il comportamento di quella getline() (che non ho mai usato). Da un file di documentazione che ho, infatti, leggo...
    The getline() function is used with input streams. getline() reads characters into buffer until either:

    - num - 1 characters have been read,
    - an EOF is encountered,
    - or, until newline is read. The newline is not put into buffer.

    If the newline is not read, the input stream is set to a failure state.
    La differenza con la mia chiedi_stringa() è che chiedi_stringa() in caso di situazioni non previste restituisce 0 anziché il numero dei caratteri letti. A ben pensarci, c'è un'ambiguità in quel comportamento: chiedi_stringa() restituisce 0 anche se la stringa è perfettamente valida ma è vuota. Forse sarebbe meglio se restituisse (size_t)-1.

    Leggendo oltre la documentazione di getline() ho scoperto che ne esiste anche una versione con un terzo parametro, un char che viene usato come delimitatore personalizzato di "fine riga" (in quel caso sarebbe forse meglio dire "fine elemento"). Molto utile!
  • Re: Input di 100 parole stampare quante volte ognuna viene ripetuta

    Grazie per i consigli a tutti alla fine sono riuscito a farlo sia in c sia in c++ capendo tutto .
Devi accedere o registrarti per scrivere nel forum
10 risposte