3

我正在尝试检查输入有效性。我得到一个文件,其中有两列,第一列是字符串,第二列是整数。分隔符是任意数量的空格。问题是,我无法弄清楚如何正确检查第二项是否真的是 int。考虑这段代码:

string line; // parameter with a string to be parsed
string name;
int num;
istringstream lineStream(line);
lineStream >> name;
lineStream >> num;

通过调用,lineStream.good()我可以检测到诸如“abcd g”之类的输入,但是当我放入诸如“abcd 12a”之类的内容时,它会被解析为“abcd”和12。与“abcd 12.2”等相同。

在 Java 中,我可以使用String.split()一个数组,然后解析每个整个元素,而不是忽略任何字符,但我不知道这里的正确方法是什么。

感谢提示

4

2 回答 2

1

std::stringstream提取int. 如果int提取失败,则根本没有整数。如果成功但流中仍有内容,则说明行中内容过多。我会这样处理这个问题:

std::string line, name;
int num;
while (std::getline(file, line)) {
  std::stringstream line_stream(line);
  if (line_stream >> name >> num &&
      line_stream.eof()) {
    // Line was of the correct format
  }
}

基本上,有两个检查:

  1. line_stream >> name >> num如果无法提取 或 将string失败int
  2. 在这些提取之后,eof如果它们到达流的末尾,则将设置该位。line_stream.eof()如果流中仍有内容,则将失败。

显然,这是一种非常脆弱的方法,仅适用于特定情况,并且需要适应行格式的几乎任何变化。

于 2013-03-11T17:43:17.137 回答
0

您可以读取两个字符串,然后检查第二个字符串是否真的是一个数字。像这样的东西:

std::string line; // parameter with a string to be parsed
std::string name;
std::string strNum;
int num;
std::istringstream lineStream(line);
lineStream >> name;
lineStream >> strNum;

if (isNumber(strNum))
{
   num = atoi(strNum.c_str());
}

//

bool isNumber(const std::string& strNum)
{
   bool lIsNumber = true;
   std::string::const_iterator it = strNum.begin();
   while (it != strNum.end())
   {
      if (!std::isdigit(*it))
      {
         lIsNumber = false;
         break;
      }
      ++it;
  }
   return lIsNumber;
}
于 2013-03-11T17:51:14.817 回答