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::string
istream& 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é).
Cela ressemble beaucoup à des devoirs – lothar