int a, b, c, d;
有4个变量。
我希望用户输入4个值,每个值用逗号(,)
分隔就像这样:
标准输入:
1,2,3,4
以下代码适用于C
scanf("%d,%d,%d,%d", &a, &b, &c, &d);
但我应该如何在C ++中编码?
答案 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
转移到另一个流对象,仍然必须予以处理。