友 我想读一对用\ t分隔的字符。我想继续读取输入,直到用户为任何字符输入z。
以下是我认为的选项:
while (cin>>ch1>>ch2)
{
// process ch1 & ch2
}
std::string str;
while (getline(cin, str) ){
//split string
}
另外,我想验证输入以确保它是正确的。请建议最好的方法。如果这是重复的,请指出我正确的。
感谢。
答案 0 :(得分:3)
尽管名称如此,但您可以使用std::getline()
来阅读除行之外的其他内容。它需要一个表示分隔符的可选第三个参数。默认值为'\n'
,但没有理由不能使用'\t'
。
std::string line;
while( std::getline(is,line) ) { // read lines
std::istringstream iss(line);
std::string field;
while( std::getline(iss,field,'\t') { // read fields from line
// process field
}
}
答案 1 :(得分:2)
你的第一种方法很好,非常C ++。唯一的问题是它会读取字符,不仅用\t
分隔,而且例如用普通空格();
代码看起来如下:
#include <iostream>
void main () {
char c1, c2;
while (std::cin >> c1 >> c2) {
if (c1 == 'z' || c2 == 'z') break;
// Otherwise do something useful
}
}
替代方法是使用getche()
从输入中获取一个符号并在屏幕上显示。这是代码:
#include <iostream>
#include <conio.h>
void main () {
while (true) {
char c1 = getche();
char delimiter = getche();
char c2 = getche();
// Output end of line
std::cout << std::endl;
if (delimiter != '\t' || c1 == 'z' || c2 == 'z') break;
// Otherwise do something useful
}
}
请注意,您现在无需在输入序列后按enter
键。如果您愿意,可以再添加一个getche()
调用并检查char是否等于32(输入代码)。
答案 2 :(得分:1)
int main(int argc, char* argv[])
{
char c;
int count = 0;
string s; // s.reserve(LOTS);
while(cin) while( cin.get(c) ) { // consume newlines as well
if( c == '\t' ) continue;
if( c == 'z' ) break;
++count;
s += c;
}
cout << "got " << count << " tokens." << endl;
cout << s << endl;
return 0;
}