我将以以下形式获得输入:
(8,7,15)
(0,0,1) (0,3,2) (0,6,3)
(1,0,4) (1,1,5)
(2,1,6) (2,2,7) (2,5,8)
(3,0,9) (3,3,10) (3,4,11) (3,5,12)
(4,1,13) (4,4,14)
(7,6,15)
我必须记住三倍的数量。我写了一个快速测试程序,尝试从cin
读取输入,然后拆分字符串以从输入中获取数字。该程序似乎没有读取所有行,它在(1,1,5)
后停止并随后打印出随机7
我为我的作业创建的其中一个函数创建了这个快速测试函数:
int main ()
{
string line;
char * parse;
while (getline(cin, line)) {
char * writable = new char[line.size() + 1];
copy (line.begin(), line.end(), writable);
parse = strtok (writable," (,)");
while (parse != NULL)
{
cout << parse << endl;
parse = strtok (NULL," (,)");
cout << parse << endl;
parse = strtok (NULL," (,)");
cout << parse << endl;
parse = strtok (NULL," (,)");
}
}
return 0;
}
有人可以帮我修改我的代码或给我一份工作样本吗?
答案 0 :(得分:3)
您可以使用这个简单的功能:
istream& read3(int& a, int& b, int& c, istream& stream = cin) {
stream.ignore(INT_MAX, '(');
stream >> a;
stream.ignore(INT_MAX, ',');
stream >> b;
stream.ignore(INT_MAX, ',');
stream >> c;
stream.ignore(INT_MAX, ')');
return stream;
}
它希望流从(
开始,因此它会跳过任何字符并在它看到的第一个(
后停止。它会将int
读入a
并通过引用传递(因此外部a
受此影响),然后读取并跳过它看到的第一个逗号。洗涤,冲洗,重复。然后在阅读第三个int
后,它会跳过结束)
,因此可以再次执行此操作。
它还会返回一个istream&
,当流结束时,operator bool
已重载以返回false
,这就是示例中的while
循环。
你这样使用它:
// don't forget the appropriate headers...
#include <iostream>
#include <sstream>
#include <string>
int a, b, c;
while (read3(a, b, c)) {
cout << a << ' ' << b << ' ' << c << endl;
}
打印:
8 7 15
0 0 1
0 3 2
0 6 3
1 0 4
1 1 5
2 1 6
2 2 7
2 5 8
3 0 9
3 3 10
3 4 11
3 5 12
4 1 13
4 4 14
7 6 15
当你给它输入时。
因为这是一项作业,我会留给你添加错误处理等等。
答案 1 :(得分:1)
我9天前写了一篇博客来解析这些输入:
您可以在此处查看输入内容:http://ideone.com/qr4DA