[C++] Problema con le stringhe

Pubblicità

Mattnet

Utente Attivo
Messaggi
165
Reazioni
1
Punteggio
38
Ho un problema nell'input di una stringa. Nel case 1 ho scritto gli input di 2 strnghe usando gets(stringa), il problema è che quando provo il programma, mi salta il gets e io non posso mettere nessuna stringa in input. Ho provato ad usare getline ma non riesco a capire molto bene come funziona, qualcuno può aiutarmi? Qui sotto ho messo tutto il programma.

Codice:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>

using namespace std;
void main()
{
    int S,NP[40],NC[40],MAX,C,R,I,K,N;
    char CO[40][20],NO[40][20],C2[20];
    bool SW;
    SW=true;
    //ciclo ripetizione programma
    do
    {
        //ciclo ripetizione menu
        do
        {
            cout<<"Inserisci il num. associato all'operazione che si vuole effettuare."<<endl;
            cout<<"1- Inserimento dati"<<endl;
            cout<<"2- Vincitore"<<endl;
            cout<<"3- Classifica"<<endl;
            cout<<"4- Finalisti"<<endl;
            cin>>S;
            if (SW==true && S!=1)
                cout<<"Non puoi scegliere altre funzioni oltre alla 1 se non hai ancora inserito alcun dato."<<endl;
        }
        while (SW==true && S!=1);
        switch(S)
        {
            case 1:
                SW=false;
                do
                {
                    cout<<"Inserisci il numero di concorrenti."<<endl;
                    cin>>N;
                    if (N<=1 || N>40)
                        cout<<"Hai inserito un numero di concorrenti non valido. Il numero deve essere compreso tra 2 e 40."<<endl;
                }
                while (N<=0 || N>40);
                for (I=0;I<N;I++)
                {
                    cout<<"Inserisci il numero di partecipazione del "<<I+1<<"^ concorrente."<<endl;
                    cin>>NP[I];
                    printf("Inserisci il cognome del concorrente.\n");
                    gets(CO[I]);
                    printf("Inserisci il nome del concorrente.\n");
                    gets(NO[I]);
                    cout<<"Inserisci il numero di centri effettuati."<<endl;
                    cin>>NC[I];
                }
                break;
            case 2:
                MAX=NC[0];
                for (I=1;I<N;I++)
                    if(MAX<NC[I])
                        MAX=NC[I];
                for(I=0;I<N;I++)
                    if (NC[I]==MAX)
                    {
                        cout<<"Num. di partecipazione: "<<NP[I]<<endl;
                        cout<<"Nome e Cognome del concorrente: "<<NO[I]<<" "<<CO[I]<<endl;
                        cout<<"Num. Centri effettuati: "<<NC[I]<<endl;
                    }
                break;
            case 3:
                for (I=0;I<19;I++)
                    for (K=I+1;K<N;K++)
                        if (NC[I]<NC[K])
                        {
                            C=NC[I];
                            NC[I]=NC[K];
                            NC[K]=C;
                            C=NP[I];
                            NP[I]=NP[K];
                            NP[K]=C;
                            strcpy_s(C2,NO[I]);
                            strcpy_s(NO[I],NO[K]);
                            strcpy_s(NO[K],C2);
                            strcpy_s(C2,CO[I]);
                            strcpy_s(CO[I],CO[K]);
                            strcpy_s(CO[K],C2);
                        }
                for (I=0;I<N;I++)
                    cout<<I+1<<"^ classificato: "<<NO[I]<<" "<<CO[I]<<" con "<<NC[I]<<" centri."<<endl;
                break;
            case 4:
                MAX=NC[0];
                for (I=1;I<N;I++)
                    if(MAX<NC[I])
                        MAX=NC[I];
                for(I=0;I<N;I++)
                    if (NC[I]==MAX)
                    {
                        cout<<"Num. di partecipazione: "<<NP[I]<<endl;
                        cout<<"Nome e Cognome del concorrente: "<<NO[I]<<" "<<CO[I]<<endl;
                        cout<<"Num. Centri effettuati: "<<NC[I]<<endl;
                    }
                break;
            default:
                cout<<"Hai selezionato un numero non valido. Scegliere una nuova operazione."<<endl;
        }
        cout<<"Vuoi fare altre operazioni con questo programma?"<<endl;
        cout<<"1- Si"<<endl;
        cout<<"2- No"<<endl;
        cin>>R;
    }
    while (R==1 || SW==true);
    cout<<"Arrivederci."<<endl;
}
 
prima del gets("stringa"); prova a mettere fflush(stdin);
se non ricordo male dovrebbe svuotare il buffer di tastiera

perchè altrimenti il gets trova il buffer già scritto e prende quei dati li invece di chiederli all'utente
 
Permettetemi due piccoli consigli presi dal libro delle cose DA NON FARE IN C:

- MAI usare gets(), vi rendete vulnerebili ai più banali attacchi basati su un buffer overflow. Usa fgets()

- secondo lo standar fflush() non è definita sugli stream di input, ma solo su quelli di output. Quindi su una certa implementazione dello standard (usando un dato compilatore / una certa libreria del C) il tuo programma funzionerà, usandone un'altro no.
 
Si ma per adesso non ho problemi visto che comunque è un esercizio di scuola (e non avrei mai avuto sto problema se avessi deciso di usare il 6.0 della scuola, ma volevo usare qualche prog più aggiornato XD)
 
Pubblicità
Pubblicità
Indietro
Top