在C++中搜索字符串中的字符串
Searching for strings within a string in C++
每个人。我是一名经验丰富的C程序员,正在努力适应C++。我想做这个C语句的等价物。。。
sscanf(str, "%s %s", sub1, sub2);
但是使用C++的字符串对象。假设str是"hello-world",执行上面的sscanf语句会将"hello"放在sub1中,将"world"放在sub2中。我知道我可以像在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";
但它输出"是!不是!",这意味着它选择了"你好",但没有选择"世界"。有什么想法吗?
这是因为与cin
一起使用的operator>>
将只捕获"hello"短语,并将在第一个分隔符处停止(在本例中为空格)。如果要捕获用户键入的第一行分隔符之前的整个输入行,则必须使用getline(cin, q)
。getline()
的两个参数版本使用换行符作为分隔符,但也有三个参数版本允许您指定自定义的行分隔符字符。
永远不要在不进行错误检查的情况下使用iostreams。正如Jason所说,阅读整行,而不仅仅是一个令牌,即使这样也要检查错误:
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
变成循环。
基本上,您可以将每个格式化的提取(getline
、>>
)作为一个条件进行检查,因为结果可以转换为可测试的内容,如果操作失败,条件将为false
。因此,除非操作成功,否则决不能解释声称的收件人变量!
如果您将此检查添加到代码x >> h >> w;
中,您将永远不会通过该行而不失败。