我正在尝试创建一个过滤掉句子中所有标点符号和空格的函数,并仅返回新字符串中的字母和数字。
离。如果我输入:嗨,我的名字是Zach1234。 我希望它只返回:himynameiszach1234
但它仍然只返回第一个字母。 关于如何解决这个问题的任何想法?
#include <iostream>
#include <cctype>
using namespace std;
string filter(string str)
{
string result = "";
for(int i = 0; i < (str.size()-1); i++)
{
if(isspace(str[i]))continue;
if(ispunct(str[i]))continue;
if(isdigit(str[i]))result += str[i];
if(isalpha(str[i]))result += str[i];
}
return(result);
}
int main()
{
string happy;
cout <<"Please enter a string\n";
cin >> happy;
cout << filter(happy) << endl;
return(0);
}
答案 0 :(得分:1)
cin >> happy;
此代码从输入中读取字符串,直到获得空格,因此如果键入:
嗨,我的名字是Zach1234
你会得到:
您好;
对于这个循环,
for(int i = 0; i < (str.size()-1); i++)
条件应为:i < str.size()
或i <= str.size() - 1
答案 1 :(得分:1)
问题是cin >> happy;
没有读入你的所有输入。 >>
运算符将停在它读取的第一个空白字符处,并将其保留在流中。相反,您需要使用std::getline()
。
std::getline(std::cin, happy)
这会将流中的内容存储到happy
,直到它到达换行符或文件末尾。如果它确实在换行中读取,则它不会被添加到字符串中,但会被丢弃。混合>>
和`getline()时需要注意:Need help with getline()
正如user5141375所提到的,你的for循环也是一种情感。 size()
返回字符串中的字符数,因此您需要循环到i < str.size()
而不是i < str.size() - 1
答案 2 :(得分:0)
问题解决了。我应该使用getline()而不是cin。