gpt4 book ai didi

C++ : How to assign the same input to a string and an integer in 2 lines?

转载 作者:行者123 更新时间:2023-11-27 22:51:07 25 4
gpt4 key购买 nike

我是 C++ 的初学者,实际上我正在关注 the Google tutorial

尝试在第二个示例中更进一步,这是我的问题:检查输入是否为数字,如果不是,则能够在错误消息中重述它。。。 p>

这是我用来解决这个问题的方法,但代码长度告诉我还有更短的方法:

#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;
}

最佳答案

您第一次尝试的问题是 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 的第二个参数告诉您整数转换停止工作的位置。因此,如果字符串中有非整数数据(例如“123abc”),则 p 将位于字符串末尾之前的某个位置。如果 p 在末尾,那么整个字符串一定是一个数字。

关于C++ : How to assign the same input to a string and an integer in 2 lines?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37095004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com