【问题标题】:read pair of characters separated by \t c++读取由 \t c++ 分隔的一对字符
【发布时间】:2010-04-24 21:31:49
【问题描述】:

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

以下是我想到的选项:

while (cin>>ch1>>ch2)
{

// process ch1 & ch2

}

std::string str;

while (getline(cin, str) ){

//split string

}

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

谢谢。

【问题讨论】:

    标签: c++ getline


    【解决方案1】:

    尽管有它的名字,您可以使用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 字符控制台输入不是浪费吗? :)
    • @Kotti:可能是这样,但是......首先,使用std::getline() 绝对是最简单的方法。然后 - 为什么要优化一段等待用户输入的代码(或磁盘,这并没有太大的区别)? 如果发现这段代码很慢(我非常怀疑),那么以后总是可以用优化的代码替换它。在那之前,可读且无错误的代码规则。
    • 我不知道我应该如何看待两个小时以来没有人注意到我对std::getline() 的第二次调用错过了'\t' 参数...
    【解决方案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(输入代码)。

    【讨论】:

    • 一般来说,您的第二种方法也可以,但需要额外的身体动作来解析字符串,因此不建议用于此类输入序列。
    • 我不认为&lt;conio.h&gt; 是标准标题。
    • 我同意,但有时它非常有用(只是为了简化普通控制台解析器的编写)
    【解决方案3】:
    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-15
      • 2021-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      相关资源
      最近更新 更多