我是c ++编程的新手,并且想编写一个具有以下要求的程序:
给出的文字包含
过滤掉不在0..9
,a..z
或A..Z
范围内的所有字符。
这意味着当我输入:
The quick brown fox jumps over the lazy dog!
输出将是:
Thequickbrownfoxjumpsoverthelazydog
我输入了以下代码并尝试运行它,结果很好。但是,当我将其提交到另一个c ++平台以检查有效性时,没有任何输出要生成。
我很困惑。如果可以,请帮助。非常感谢大家。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string line;
getline(cin, line);
for (int i = 0; i < line.size(); ++i)
{
if (!((line[i] >= 'a' && line[i] <= 'z') || (line[i] >= 'A' && line[i] <= 'Z') || (line[i] >= '0' && line[i] <= '9')))
{
line[i] = '\0';
}
}
cout << line;
return 0;
}
答案 0 :(得分:3)
如果要删除字母和数字以外的字符,最好使用erase–remove idiom。
std::isalnum
检查字符串中的字符是字母还是
数字。如果将其打包成一元谓词(std::remove_if
,
和上述谓词,收集
字符串,必须将其删除。std::string::erase
删除所有由收集的字符
std::remove_if
。如下所示: See a demo here
#include <cctype> // std::isalnum
#include <algorithm> // std::remove_if
std::string str{ "The quick brown fox jumps over the lazy dog!" };
// predicate to check the charectors
const auto check = [](const char eachCar)->bool { return !std::isalnum(eachCar); };
// collect the chars which needed to be removed from the string
const auto charsToRemove = std::remove_if(str.begin(), str.end(), check);
// erase them out
str.erase(charsToRemove, str.end());
免责声明:以上解决方案未涵盖OP的问题(@john在his answer中对此进行了很好的解释),但可能会对将来的读者有所帮助。
答案 1 :(得分:1)
您的代码只是将一个字符替换为另一个字符。从字符串中删除字符的简单方法是使用erase
方法。像这样
#include <iostream>
#include <string>
using namespace std;
int main()
{
string line;
getline(cin, line);
for (int i = 0; i < line.size(); )
{
if (!((line[i] >= 'a' && line[i]<='z') || (line[i] >= 'A' && line[i]<='Z')||(line[i] >= '0' && line[i]<='9')))
{
line.erase(i, 1);
}
else
{
++i;
}
}
cout << line;
return 0;
}
请注意,当我们不删除字符时,代码只会在i
上加上一个字符,否则,在删除一个字符之后,您会跳过该字符,因为字符串现在短了一个。
答案 2 :(得分:0)
\0
是字符串的结尾,因此,当您使用它时,将在第一次出现时就切断它。
最好从数组中删除该char,但是我建议您从头到尾进行操作:
伪代码:
for i = size(line)-1 back to i = 0:
if line[i] in ('a'-'z', 'A'-'Z', ...):
for j = i to size(line)-1:
line[j] = line[j+1]
reduce_by_the_last_character(line)