How to accept case-insensitive inputs?
如何接受不区分大小写并允许在用户输入中嵌入空格?因此用户可以进入"香港",并与输入进行正确匹配。
我只有input[0] = toupper(input[0]);,它只接受区分大小写在单词开头的情况。
1 2 3 4 5 6 7 8 9 10 11
| while(true){
cout <<"Enter a city by name:"<<"";
std::getline (std::cin,input);
if (input =="quit")
{
break;
}
input[0] = toupper (input[0]);
//....how do I loop to find all letter's in the input string variable?
} |
- 当您想多次执行某项操作(如字符串的每个字符的大写)时,可以编写一个循环。所以写一个循环,在每个字符上使用toupper。如果你多展示一些你的代码,我可能会告诉你怎么做。只有一行代码不太适合使用。
- 当你想写一个循环时,你会意识到有一个更清晰的算法。其中一个是std::transform。
- @克里斯,我是个老前辈,但我从来没有发现回路不清楚。
- @约翰,虽然一个算法附带了一个名字,它应该通过阅读一个单词立即让你感觉到它在做什么,而且你不会重新发明已经做过的和优化过的。我承认一个ranged for,在它的简洁性中,也使它非常清晰,并且没有样板的begin和end调用。
可以使用一次循环将整个字符串转换为大写一个字符,但更好的解决方案是使用C++标准库的EDCOX1×0函数来实现:
1 2
| std::string hk ="hong konG";
std::transform(hk.begin(), hk.end(), hk.begin(), ::toupper); |
这会将::toupper应用于字符串的所有字符,从而产生一个读取"HONG KONG"的字符串。
IDENO演示。
- 什么是转换库?
- #include
- 此代码可能会为任意用户输入调用ub,请参阅stackoverflow.com/q/21805674/3002139
1 2
| for (auto& c : str)
c = std::toupper(c) |
- 此代码可能会为任意用户输入调用ub,请参阅stackoverflow.com/q/21805674/3002139
您可以像这样将整个字符串转换为大写
1 2
| for (size_t i = 0; i < input.size(); ++i)
input[i] = toupper (input[i]); |
使用std::transform的另一个建议也是一个完美的解决方案。
- 它不起作用,当我把上面的代码添加到代码中时,它不能"退出"代码。
- 也许你在某个地方犯了一个错误,很难在没有看到你的代码的情况下分辨出来。
- 我不想把所有的字符串都改成大写,我只是想确保如果有人进入"kong",输出结果仍然是"kong"。
- 我正在尝试将输入匹配到我拥有的数组列表中,如果有人输入的是"kong",而在我的列表列表中,我拥有"kong",则输入仍将匹配列表中的输入。
- 列表中的字符串都是小写的吗?如果是,则将输入字符串转换为小写(使用to lower而不是toupper)。如果列表中混合了案例,那么在比较之前,请将输入字符串和列表字符串转换为相同的案例。我想你已经被赋予了解决这个问题的工具,你只需要思考一下你在做什么。
- 此代码可能会为任意用户输入调用ub,请参阅stackoverflow.com/q/21805674/3002139