C ++:如何将相同的输入分配给一个字符串和一个2行的整数?

时间:2016-05-08 00:26:33

标签: c++

我是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;
}

1 个答案:

答案 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在最后,那么整个字符串必须是一个数字。