2010-04-24 29 views
1

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

下面是我想的选项:

while (cin>>ch1>>ch2) 
{ 

// process ch1 & ch2 

} 

std::string str; 

while (getline(cin, str)){ 

//split string 

} 

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

谢谢。

回答

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 
    } 
} 
+0

是不是浪费创建2个字符串和额外的istringstream对象来解析3字符控制台输入? :) – 2010-04-24 21:55:47

+1

@Kotti:很可能,但是...对于其中一个,使用'std :: getline()'确实是最简单的方法。然后 - 为什么要优化一段等待用户输入的代码(或磁盘,这没有太大区别)? __如果这个代码发现速度很慢(我非常怀疑),那么以后它总是可以被优化后的代码取代。在此之前,可读和无错的代码规则。 – sbi 2010-04-24 22:06:08

+0

我不知道我应该怎么做,事实是两个小时后,没有人注意到我对'std :: getline()'的第二次调用错过了''\ t''参数...... – sbi 2010-04-24 23:55:46

2

你的第一种方法是良好的,非常C++ ish。唯一的问题是它将读取不仅被\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(输入代码)。

+1

一般来说,你的第二个方法也不错,但需要额外的身体动作解析字符串,因此,不建议这种类型的输入序列。 – 2010-04-24 21:50:56

+1

我不认为''是标准标题。 – sbi 2010-04-24 21:51:06

+0

我同意,但有时它是非常有用的(只是为了简化平凡的控制台解析器的编写) – 2010-04-24 21:52:46

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; 
} 
相关问题