Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [C++] allocazione vettore

    voglio far acquisire una parola da tastiera e farla scrivere in un vettore di massimo 20 caratteri.
    Come faccio a fare un controllo prima che la parola venga salvata nel vettore?
    cioè io voglio che se l'utente inserisce una parola di 25 caratteri, il programma dica di reinserire la parola.

    es.
    char vett[20];
    cin>>vett;

    Se lunghezza della parola inserita da tastiera è maggiore di 20 deve dire di inserire dinuovo la parola.

  2. #2
    Usa cin.get(), limitando l'acquisizione alla lunghezza del buffer; se l'ultimo carattere della stringa acquisita è un newline allora hai acquisito tutta la stringa, altrimenti significa che sono stati troncati dei caratteri. In tal caso, usa cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n') per ignorare tutti i caratteri fino al ritorno a capo e visualizzare il messaggio.

    In ogni caso, la soluzione più semplice è usare la classe std::string e lasciare che si gestisca la memoria per i fatti suoi.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    grazie per la risposta, userò il primo metodo, in quanto il professore string nn le ha spiegate, e perciò non possiamo usarle(putroppo).

  4. #4
    Sto provando ad usare il primo metodo che mi hai consigliato, ma non riesco ad applicarlo, come dovrei userlo in questo codice?
    codice:
    #include <iostream>
    using namespace std;
    
    class persona{
    private:
    	char nome[20];		
    
    public:
    	void acquisisci();
    	void controlla_caratteri(char*,int);
    };	
    
    void persona::acquisisci(){
    	cout<<"Inserisci nome: ";
    	controlla_caratteri(nome,sizeof(nome));
    };
    
    void persona::controlla_caratteri(char *vettore,int n){
    //inserisci qui il metodo che mi hai detto di usare.
    }
    
    int main(){
    	persona P;
    	P.acquisisci();
    	return 0;
    }
    Ovviamente qusto è un pezzettino di codice, per poter provare l'acquisizione.

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    sizeof(nome) non potrà mai funzionare...
    codice:
    #include <iostream>
    #include <cstring>
    #define LEN 22
    using namespace std;
    
    class persona{
    private:
    	char nome[LEN];		
    
    public:
    	void acquisisci();
    	void controlla_caratteri(char*,LEN);
    };	
    
    void persona::acquisisci(){
    	cout<<"Inserisci nome (massimo " << LEN - 2 << "caratteri): ";
    	controlla_caratteri(nome, LEN);
    };
    
    void persona::controlla_caratteri(char *vettore,int n){
    	do {
    		cin.getline(vettore, n);
    	} while(vettore[strlen(vettore)-1] == '\n');
    }
    
    int main(){
    	persona P;
    	P.acquisisci();
    	return 0;
    }
    Non sono sicuro sia corretto: non ho compilato. In ogni caso la lunghezza della stringa è di 2 maggiore in quanto i due caratteri finali servono a contenere rispettivamente il caporiga (\n) e il terminatore di stringa (\0).

    Se volessi rimuovere il \n basta: vettore[strlen(vettore)-1] = '\0';
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Alla compilazione mi da 3 errori, ma sono dovuti a una cosa stupida: void controlla caratteri(char*,int); //(hai messo al posto di int, LEN);
    Cmq non funziona in quanto anche se inserisco più di 20 caratteri, non mi richiedde di inserire dinuovo la parola, ma esce direttamente.
    Io voglio che se l'utente inserisce una parola più lunga di 20 il programma deve fargli reinserire la parola.

  7. #7
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    fail
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    codice:
    #include <iostream>
    #include <cstring>
    #define LEN 22
    using namespace std;
    
    class persona{
    private:
    	char nome[LEN];		
    
    public:
    	void acquisisci();
    	void controlla_caratteri(char*,int);
    };	
    
    void persona::acquisisci(){
    	cout<<"Inserisci nome (massimo " << LEN - 2 << "caratteri): ";
    	controlla_caratteri(nome, LEN);
    };
    
    void persona::controlla_caratteri(char *vettore,int n){
    	while(true) {
    		cin.getline(vettore, n);
    		if(vettore[strlen(vettore)-1] == '\n')
    			break;
    		cin.ignore(numeric_limits<streamsize>::max(), '\n');
    	}
    }
    
    int main(){
    	persona P;
    	P.acquisisci();
    	return 0;
    }
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  9. #9
    mi da questi errori:

    error C2065: 'numeric_limits' : undeclared identifier

    error C2275: 'streamsize' : illegal use of this type as an expression
    c:\program files (x86)\microsoft visual studio\vc98\include\iosfwd(21) : see declaration of 'streamsize'

    error C2039: 'max' : is not a member of '`global namespace''

    error C2065: 'max' : undeclared identifier

  10. #10
    Per std::numeric_limits devi includere <limits>.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.