2009-04-17 4 views
1

Je vais devoir accepter une chaîne de 5 nombres de l'utilisateur (seulement 5). Dois-je utiliserBesoin de l'utilisateur pour entrer la chaîne/vérifier la longueur de la chaîne (C++)

istringstream 

pour la même? Est-ce que je ne peux pas sortir avec quelque chose comme ça?

int main() 
{ 
    char *InputMain; 
    InputMain=(char *)malloc(5+1); 
    cout << "Enter the number : " <<endl; 
    cin.getline (InputMain, 5, '\n');    // Input goes into InputMain 
    cout << "The number entered is : " << InputMain <<endl; 
    cin.get(); 
} 

Puis vient la partie suivante ..

Comment as-je fais que les entrées utilisateur seulement 5 CHARS? Et peut-être que si l'utilisateur entre plus de 5 caractères, je devrais afficher un avertissement en disant que seulement 5 caractères autorisés ..

Encore une question, puisque c'est essentiellement une chaîne, je vais devoir valider l'entrée pour être seulement des nombres en analysant chaque caractère de la chaîne et en vérifiant les valeurs ASCII respectives (pour les chiffres). Cette approche est-elle la bonne?

+0

Cela ressemble beaucoup à des devoirs – lothar

Répondre

4

Malheureusement, il n'existe aucun moyen portable de restreindre le nombre de caractères entrés en C++. Mais quelle que soit la plate-forme que vous utilisez fournira un mécanisme: par exemple sur Windows, recherchez Console functions.

Si vous allez avec ancienne entrée simple iostreams C++ de cin, il est une bonne idée de lire le texte initial en utilisant std::stringistream& getline(istream&, string&) - cela évitera les débordements de tampon, car string s redimensionnent nécessaire. (Votre code impliquant getline(InputMain, 5, '\n') est techniquement sûr, car il ne lira pas plus de 5 caractères dans InputMain, mais ce code est fragile - si vous décidez plus tard que vous voulez 6 caractères, vous pouvez facilement oublier de mettre à jour votre appel à malloc(), leader . à des accidents aussi, vous avez besoin de se rappeler de free(InputMain) Mais comme je le disais, utilisez string à la place)

en ce qui concerne l'analyse syntaxique:..

que vous lisiez l'entrée dans un string en utilisant getline(cin, str) ou une plate-forme spécifique code, une fois qu'il est là, vous devez le sortir sous la forme d'un numéro. C'est là la classe istringstream est utile - il vous permet de traiter un flux comme string existant pour lire, de sorte que vous pouvez utiliser l'entrée au format >> opérateur:

string str; 
if (!getline(cin, str)) { 
    cerr << "Something went seriously wrong...\n"; 
} 

istringstream iss(str); 
int i; 
iss >> i; // Extract an integer value from the stream that wraps str 

if (!iss) { 
    // Extraction failed (or a more serious problem like EOF reached) 
    cerr << "Enter a number dammit!\n"; 
} else if (i < 1000 || i > 9999) { 
    cerr << "Out of range!\n"; 
} else { 
    // Process i 
} 

Si vous utilisez C++ iostreams, vous peut effectivement extraire juste directement à partir cin au lieu de passer par un string et un istringstream:

int i; 
cin >> i; // Extract an integer value from cin 

Cependant, cela peut avoir des effets indésirables subtils; notamment, tous les caractères supplémentaires sur la ligne tapée par l'utilisateur (en particulier le '\n' tapé quand ils pressent la touche Entrée) resteront dans le tampon d'entrée pour être lus par l'opération << suivante. Souvent cela n'a pas d'importance, mais parfois c'est le cas: par ex. si vous poursuivez avec cin.get();, en attendant que cela attende une pression sur une touche, ce ne sera pas - il va juste lire le '\n' (ou le premier caractère non numérique que l'utilisateur a tapé).

+0

Voulez-vous dire que je devrais utiliser quelque chose comme ça? #include #include en utilisant l'espace de noms std; int main() { chaîne InputMain; cout << "Entrez le numéro:" << endl; getline (cin, InputMain); // cin >> InputMain; // ---> Est-ce que ça marcherait aussi? cout << "Le numéro entré est:" << InputMain << endl; cin.get(); } – halluc1nati0n

+0

@ halluc1nati0n: Ah désolé, j'ai donné deux approches alternatives plutôt qu'une seule approche. Je vais essayer de réparer le message pour clarifier les choses. –

+0

@ halluc1nati0n: OK, jetez un oeil maintenant. En bref: non, n'utilisez pas "cin >> InputMain;" - soit utiliser "int i; cin >> i" ou "chaîne s; getline (cin, s); int i; istringstream est (s); iss >> i;". –

Questions connexes