我写了这段代码来检测输入字符串是否有空格。请说明这种方法有什么问题。
#include <iostream>
#include <string>
using namespace std;
int main(){
string inp;
getline(cin, inp);
for (int i = 0; i < inp.length(); i++) {
string z = to_string(inp[i]);
if (z == " ") {
cout << "space";
}
else {
i++;
}
}
}
如果我输入带空格的字符串,则不会打印“空格”。
答案 0 :(得分:6)
由于inp
是std::string
,所以inp[i]
将是char
。由于std::to_string
仅对算术非字符值具有重载,因此在char上调用它类似于在所述char的整数表示上调用它。 (如果您登录z
,则可能会找到一个打印的数字。)
相反,直接将inp[i]
与一个空格进行比较。 else { i++; }
也是不必要的-您可能会跳过空格。
for (int i = 0; i < inp.length(); i++) {
if (inp[i] == ' ') { // note single quotes for char
cout << "space";
}
}
答案 1 :(得分:0)
@TrebledJ的答案说明了为什么您的代码损坏以及如何对其进行修复。
处理这种情况的另一种方法是改用std::string::find()
:
#include <iostream>
#include <string>
int main(){
std::string inp;
std::getline(std::cin, inp);
if (inp.find(' ') != std::string::npos) {
std::cout << "space";
}
}
或者,您的原始代码尝试为找到的每个空格字符输出"space"
。您可以在循环中使用find()
:
#include <iostream>
#include <string>
int main(){
std::string inp;
std::getline(std::cin, inp);
std::string::size_type idx = inp.find(' ');
while (idx != std::string::npos) {
std::cout << "space at " << idx << std::endl;
idx = inp.find(' ', idx+1);
}
}