读取\t+C++分隔的字符对

读取\t+C++分隔的字符对,c++,getline,C++,Getline,朋友们, 我想读取由\t分隔的一对字符。我想继续读取输入,直到用户为任何字符输入z 以下是我认为的选项: while (cin>>ch1>>ch2) { // process ch1 & ch2 } std::string str; while (getline(cin, str) ){ //split string } 另外,我想验证输入以确保它是正确的。请建议最好的方法。如果这是重复的,请给我指出正确的 谢谢。您的第一种方法很好,非常符合C++语

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

以下是我认为的选项:

while (cin>>ch1>>ch2)
{

// process ch1 & ch2

}

std::string str;

while (getline(cin, str) ){

//split string

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


谢谢。

您的第一种方法很好,非常符合C++语言。唯一的问题是,它不仅会读取\t分隔的字符,而且还会读取(例如)由纯空格分隔的字符

代码如下所示:

#include <iostream>

void main () {
   char c1, c2;
   while (std::cin >> c1 >> c2) {
      if (c1 == 'z' || c2 == 'z') break;
      // Otherwise do something useful
   }
}

请注意,现在您不必在输入序列后按enter键。如果您愿意,您可以再添加一个getche调用,并检查char是否等于32 enter code。

您的第一种方法很好,非常符合C++语言。唯一的问题是,它不仅会读取\t分隔的字符,而且还会读取(例如)由纯空格分隔的字符

代码如下所示:

#include <iostream>

void main () {
   char c1, c2;
   while (std::cin >> c1 >> c2) {
      if (c1 == 'z' || c2 == 'z') break;
      // Otherwise do something useful
   }
}

请注意,现在您不必在输入序列后按enter键。如果愿意,可以再添加一个getche调用,并检查字符是否等于32 enter code。

尽管名称不同,但可以使用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
  }
}

尽管名称不同,但您可以使用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
  }
}

一般来说,第二种方法也不错,但需要额外的身体运动来解析字符串,因此,不建议将其用于此类输入序列。我不认为这是标准的头。我同意,但通常来说,简化简单控制台解析器的编写是非常有用的,您的第二种方法也很好,但需要额外的身体运动来解析字符串,因此,不建议用于此类输入序列。我认为这不是标准的头。我同意,但是有时候,简化简单控制台解析器的编写非常有用。创建2个字符串和一个额外的istringstream对象来解析3字符控制台输入不是一种浪费吗@科蒂:也许是这样,但是。。。首先,使用std::getline绝对是最简单的方法。然后——为什么要优化一段等待用户或磁盘输入的代码,而这并没有多大区别?如果发现这段代码速度太慢,我非常怀疑,那么以后它总是可以被优化的代码所取代。在此之前,代码规则是可读且无错误的。两个小时以来,没有人注意到我对std::getline的第二次调用丢失了“\t”参数……创建2个字符串和一个额外的istringstream对象来解析3字符控制台输入,这难道不是一种浪费吗@科蒂:也许是这样,但是。。。首先,使用std::getline绝对是最简单的方法。然后——为什么要优化一段等待用户或磁盘输入的代码,而这并没有多大区别?如果发现这段代码速度太慢,我非常怀疑,那么以后它总是可以被优化的代码所取代。在那之前,可读性和无bug的代码规则。我不确定我应该做什么,因为有两个小时没有人注意到我对std::getline的第二次调用丢失了“\t”参数。。。