C ++:如何输入以逗号(,)

时间:2017-10-19 16:52:02

标签: c++ cin getline

int a, b, c, d;

有4个变量。

我希望用户输入4个值,每个值用逗号(,)

分隔

就像这样:

  

标准输入:

     

1,2,3,4

以下代码适用于C

scanf("%d,%d,%d,%d", &a, &b, &c, &d);

但我应该如何在C ++中编码?

1 个答案:

答案 0 :(得分:1)

我对这里不正确的评论感到惊讶 [1]

您可以采取两种基本路线:

  • 使用操纵器样式对象处理分隔符,或
  • 使用专门的构面灌注流,该构面需要空格以包含逗号。

我会专注于第一个;通常暂时将共享流与奇怪的行为混合是一个坏主意(在代码的其他部分也可以访问它的意义上“共享”;本地字符串流将是用于专门行为的理想候选者)。

'下一项必须是逗号'提取器:

#include <cctype>
#include <iostream>

struct extract
{
  char c;
  extract( char c ): c(c) { }
};

std::istream& operator >> ( std::istream& ins, extract e )
{
  // Skip leading whitespace IFF user is not asking to extract a whitespace character
  if (!std::isspace( e.c )) ins >> std::ws;

  // Attempt to get the specific character
  if (ins.peek() == e.c) ins.get();

  // Failure works as always
  else ins.setstate( std::ios::failbit );

  return ins;
}

int main()
{
  int a, b;
  std::cin >> a >> extract(',') >> b;
  if (std::cin)
    std::cout << a << ',' << b << "\n";
  else
    std::cout << "quiznak.\n";
}

运行此代码,extract操纵器/提取器/只有在下一个非空白项是逗号时才会成功。否则就失败了。

您可以轻松修改此选项以使逗号可选:

std::istream& operator >> ( std::istream& ins, optional_extract e )
{
  // Skip leading whitespace IFF user is not asking to extract a whitespace character
  if (!std::isspace( e.c )) ins >> std::ws;

  // Attempt to get the specific character
  if (ins.peek() == e.c) ins.get();

  // There is no failure!
  return ins;
}

...

std::cin >> a >> optional_extract(',') >> b;

[1] cin >> a >> b; 等同于scanf( "%d,%d", ...);。 C ++并没有神奇地忽略逗号。就像在C中一样,你必须明确地对待它们。

使用getline()stringstream的答案相同;虽然组合有效,但实际问题只是从std::cin转移到另一个流对象,仍然必须予以处理。