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

    [C++] Errore durante l'eseguibile!

    Salve ragazzi, sono nuovo, ho un errore stranissimo.
    Questo è il codice:


    codice:
    #include <iostream>
    #include <fstream>
    #include <direct.h>
    #include <string>
    
    using namespace std;
    
    
    class persona{
    private:
    	char nome[20];		
    	char cognome[20];	
    	char indirizzo[20];
    	char nascita[20];	
    	char email[20];		
    	char telefono[20];
    	char password[20];
    	char username[20];
    public:
    	void acquisisci();
    	void controlla_caratteri(char*,int);
    };	
    
    
    void persona::controlla_caratteri(char *vettore,int n)
    {
    	do
    	{
    		cin>>vettore;
    		if(strlen(vettore)>n)
    			cout<<"Errore,max "<<n<<" caratteri: ";
    	}while(strlen(vettore)>n);
    }
    
    void persona::acquisisci()
    {
    	cout<<"\nMax 20 caratteri!";
    	cout<<"\nInserisci nome: ";
    	controlla_caratteri(nome,sizeof(nome));
    	cout<<"Nome:"<<nome;
    	cout<<"\nInserisci cognome: ";
    	controlla_caratteri(cognome,sizeof(cognome));
    	cout<<"\nInserisci indirizzo: ";
    	controlla_caratteri(indirizzo,sizeof(indirizzo));
    	cout<<"\nInserisci nascita: ";
    	controlla_caratteri(nascita,sizeof(nascita));
    	cout<<"\nInserisci email: ";
    	controlla_caratteri(email,sizeof(email));
    	cout<<"\nInserisci telefono: ";
    	controlla_caratteri(telefono,sizeof(telefono));
    	cout<<"\nInserisci password: ";
    	controlla_caratteri(password,sizeof(password));
    }
    
    
    ////////////////////////////////////////////////
    int main (){
    	persona P;
    	P.acquisisci();
    	return 0;
    }
    Ovviamente questo è un pezzettino del codice.
    L'errore consiste che quando mando l'eseguibile, se scrivo più di 20 caratteri alla password, dopo giustamete(grazie al controllo) mi chiede di reinserirla, ma anche se la metto inferiore ai 20 caratteri, dopo si blocca il programma!
    Qualcuno mi può aiutare???
    grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Una volta che sfori con i caratteri in memoria, non serve a nulla controllare che la lunghezza massima sia stata superata.

    In pratica, prima della if, il danno è già stato fatto.

    Utilizza la

    cin.getline

    per l'input.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Non so se è proprio così, perchè se faccio stampare con cout il nome, che ho inserito prima in modo errato e poi in modo corretto,quello che si prende il vettore è il secondo cin, non il primo.
    Poi cosa ho notato è che se tolgo le ultime due righe dell'acquisisci, l'errore non fa più (cioè se tolgo le righe inerenti la password).

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2012
    Messaggi
    4
    Non lo so se è per questo che ti si blocca il programma, ma un errore di sicuro c'è.
    La funzione strlen() restituisce la lunghezza della stringa ma il valore restituito non conta il terminatore, quindi se inserisci 20 caratteri nell'array ne verranno inseriti 21 perchè viene aggiunto il terminatore e quindi vai a scrivere in una locazione di memoria fuori dall'array.
    La tua if controlla se il valore è maggiore, ma anche se è uguale sfora.
    Dovresti modificarlo in:
    if(strlen(vettore)>=n)

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da squalo92
    Non so se è proprio così, perchè se faccio stampare con cout il nome, che ho inserito prima in modo errato e poi in modo corretto,quello che si prende il vettore è il secondo cin, non il primo.
    Fidati ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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

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 © 2024 vBulletin Solutions, Inc. All rights reserved.