消除标点符号和空格

时间:2018-12-07 10:14:42

标签: c++ algorithm string-parsing stdstring input-filtering

我是c ++编程的新手,并且想编写一个具有以下要求的程序:

给出的文字包含

  • 单词
  • 字母
  • 数字
  • 标点符号和
  • 空白。

过滤掉不在0..9a..zA..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;
}

3 个答案:

答案 0 :(得分:3)

如果要删除字母数字以外的字符,最好使用erase–remove idiom

  1. 使用 std::isalnum 检查字符串中的字符是字母还是 数字。如果将其打包成一元谓词(),则可以应用于以下算法函数。
  2. 使用 std::remove_if, 和上述谓词,收集 字符串,必须将其删除。
  3. 最后,使用 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)