1

朋友们,我想读一对用\t分隔的字符。我想继续阅读输入,直到用户输入 z 作为任何字符。

以下是我想到的选项:

while (cin>>ch1>>ch2)
{

// process ch1 & ch2

}

std::string str;

while (getline(cin, str) ){

//split string

}

另外,我想验证输入以确保它是正确的。请建议最好的方法。如果这是重复的,请指出正确的。

谢谢。

4

3 回答 3

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
  }
}
于 2010-04-24T21:52:30.357 回答
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(输入代码)。

于 2010-04-24T21:49:50.030 回答
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;
}
于 2010-04-24T21:55:50.217 回答