朋友, 我想读取由\ t分隔的一对字符。我想继续阅读输入,直到用户输入任何字符的z。读取由 t分隔的字符对C++
下面是我想的选项:
while (cin>>ch1>>ch2)
{
// process ch1 & ch2
}
std::string str;
while (getline(cin, str)){
//split string
}
另外,我想验证输入,以确保它是正确的。请建议最好的方法。如果这是重复的,请将我指向正确的一个。
谢谢。
朋友, 我想读取由\ t分隔的一对字符。我想继续阅读输入,直到用户输入任何字符的z。读取由 t分隔的字符对C++
下面是我想的选项:
while (cin>>ch1>>ch2)
{
// process ch1 & ch2
}
std::string str;
while (getline(cin, str)){
//split string
}
另外,我想验证输入,以确保它是正确的。请建议最好的方法。如果这是重复的,请将我指向正确的一个。
谢谢。
尽管名称不同,但您可以使用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
}
}
你的第一种方法是良好的,非常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(输入代码)。
一般来说,你的第二个方法也不错,但需要额外的身体动作解析字符串,因此,不建议这种类型的输入序列。 – 2010-04-24 21:50:56
我不认为'
我同意,但有时它是非常有用的(只是为了简化平凡的控制台解析器的编写) – 2010-04-24 21:52:46
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;
}
是不是浪费创建2个字符串和额外的istringstream对象来解析3字符控制台输入? :) – 2010-04-24 21:55:47
@Kotti:很可能,但是...对于其中一个,使用'std :: getline()'确实是最简单的方法。然后 - 为什么要优化一段等待用户输入的代码(或磁盘,这没有太大区别)? __如果这个代码发现速度很慢(我非常怀疑),那么以后它总是可以被优化后的代码取代。在此之前,可读和无错的代码规则。 – sbi 2010-04-24 22:06:08
我不知道我应该怎么做,事实是两个小时后,没有人注意到我对'std :: getline()'的第二次调用错过了''\ t''参数...... – sbi 2010-04-24 23:55:46