2012-01-14 99 views
3

everyone。我是一名经验丰富的C程序员,尝试调整为C++。我想这样做的C语句相当于...在C++中搜索字符串中的字符串

sscanf(str, "%s %s", sub1, sub2); 

...但与C++的字符串对象。说str是“hello world”,做上面的sscanf语句会在sub1中放入“hello”,在sub2中放入“world”。我知道我可以在C++中使用C函数,但是我想使用C++字符串对象而不是字符数组。我已经试过这样:

string q, h, w; 
cout << "Type \"hello world\": "; 
cin >> q; 
istringstream x(q); 
x >> h >> w; 
if (h == "hello") 
    cout << "Yes!\n"; 
else 
    cout << "No!\n"; 
if (w == "world") 
    cout << "Yes!\n"; 
else 
    cout << "No!\n"; 

但它输出“否!”,这意味着它拿起了“你好”,而不是“世界”。有任何想法吗?

回答

3

这是因为与cin一起使用的operator>>只会捕获“hello”短语,并会停在第一个分隔符(在本例中为空格)。如果要捕获整个输入行直到用户键入的第一行分隔符,则必须使用getline(cin, q)getline()的双参数版本使用换行符作为分隔符,但是有三个参数的版本,它允许您指定自定义的行分隔符。

+2

如果您错误检查了流操作,那么您已经抓住了它! – 2012-01-14 04:41:33

3

切勿使用iostream而不进行错误检查。贾森说,读整条生产线,而不仅仅是一个符号,但即使这样做检查错误:

std::string line; 

if (std::getline(std::cin, line)) 
{ 
    std::string h, w; 
    std::istringstream iss(line); 

    if (iss >> h >> w) 
    { 
     // success 
    } 
    else 
    { 
     std::cerr << "Error reading your input.\n"; 
    } 
} 
else 
{ 
    std::cerr << "Error reading from stdin!\n"; 
} 

可以使if s转换循环,如果你想继续阅读。

基本上,你可以检查每一个格式化的提取(getline>>)作为条件,由于结果是转换为可测试的东西,而且条件会false如果操作失败。因此,除非操作成功,否则绝不能解释声称的收件人变量!

如果您已将此支票添加到您的代码x >> h >> w;,那么您将永远无法通过该行,而不会失败。