我是C ++的初学者,我实际上是关注the Google tutorial。
尝试进一步使用第二个示例,这是我的问题:检查输入是否为数字,如果没有,则能够在错误消息中重述。
这是我用来解决这个问题的方法,但代码长度告诉我有一个更短的方法:
#include <cstddef>
#include <iomanip>
#include <iostream>
#include <stdlib.h>
using namespace std;
bool IsInteger(string str) {
size_t non_num_position = str.find_first_not_of("0123456789-");
size_t sign_position = str.find_first_of("-", 1);
if (non_num_position == string::npos && sign_position == string::npos) {
return true;
}
return false;
}
void Guess() {
int input_number = 0;
string input_string;
do {
cout << "Try to guess the number between 0 and 100 (type -1 to quit) : ";
cin >> input_string;
if (!IsInteger(input_string)) {
int input_string_length = input_string.size();
cout << "Sorry but « " << input_string << " » is not a number." << endl;
cin.clear();
cin.ignore(input_string_length, '\n');
continue;
}
input_number = atoi(input_string.c_str());
if (input_number != -1) {
cout << "You chose " << input_number << endl;
}
} while (input_number != -1);
cout << "The End." << endl;
}
int main() {
Guess();
return 0;
}
以下是我尝试遵循的较短方式,但cin
似乎在被分配到input_number
时被“清空”(因为按位运算符?):
void Guess() {
int input_number = 0;
string input_string;
do {
cout << "Try to guess the number between 0 and 100 (type -1 to quit) : ";
if (!(cin >> input_number)) {
getline(cin, input_string);
cout << "Sorry but " << input_string << " is not a number." << endl;
cin.clear();
cin.ignore(100, '\n');
continue;
}
if (input_number != -1) {
cout << "You chose " << input_number << endl;
}
} while (input_number != -1);
cout << "The End." << endl;
}
解决方案:
#include <iomanip>
#include <iostream>
#include <string>
using namespace std;
void Guess() {
int input_number = 0;
string input_string;
do {
cout << "Try to guess the number between 0 and 100 (type -1 to quit) : ";
cin >> input_string;
try {
input_number = stoi(input_string);
if (input_number != -1) {
cout << "You chose " << input_number << endl;
}
}
catch (const exception&) {
cout << "Sorry but " << input_string << " is not a number." << endl;
}
} while (input_number != -1);
cout << "The End." << endl;
}
int main() {
Guess();
return 0;
}
答案 0 :(得分:4)
第一次尝试的问题是IsInteger不必要地复杂且冗长。否则,你有正确的想法。你的第二次尝试不太正确....一旦你从cin读取,数据就消失了。因此,与第一次尝试一样,您需要将数据存储在字符串中。
这是一个较短的例子,根本不需要IsInteger:
size_t p = 0;
int input_number = std::stoi(input_string, &p);
if (p < input_string.length())
{
cout << "Sorry but " << input_string << " is not a number." << endl;
conitnue;
}
stoi
的第二个参数告诉您转换为整数的位置何时停止工作。因此,如果字符串中存在非int数据(例如'123abc'),那么p将在字符串结尾之前的某个位置。如果p在最后,那么整个字符串必须是一个数字。