在C ++中从用户输入中删除/删除符号

时间:2012-02-16 19:19:17

标签: c++ string ascii

这是我到目前为止所拥有的:

string stripSymbols(string str) {
    int stringSize = strlen(str.c_str());

    for (int i = 0; i < stringSize; i++)
        if (str[i] == 0x46)
            str[i] = 0x32;
    return str;
}

我知道ascii代码可能不对。这是问题的一部分。但是一旦我弄明白了,我想我可以在这里为每个符号放置一个开关,用一个空的空格替换每个符号。

或者更好的是,我可以在for循环中使用for循环,循环遍历一串符号,并用空格替换任何与用户输入匹配的循环。

我有几个想法,但我想知道是否有更有效的方法来做到这一点。

更新1:

这段代码看起来好一点并且有效:

string stripSymbols(string str) {
    int stringSize = str.size();
    for (int i = 0; i < stringSize; i++)
        if (str[i] == '.')
            str[i] = ' ';
    return str;
}

但回复提供了更有效的解决方案。

更新2:

解决方案受到Kerrek SB的回复启发:

char symbols [] = {'!', '?', ',', '\'', '.'};
int symbols_size = sizeof(symbols) / sizeof(char);  

for (int j = 0; j < symbols_size; j++)
    replace(str.begin(), str.end(), symbols[j], ' ');

5 个答案:

答案 0 :(得分:3)

如果您想用空格替换任何非字母数字字符:

std::replace_if(str.begin(), str.end(), [](char c){return !std::isalnum(c);}, ' ');

答案 1 :(得分:2)

查看string::findstring::replace方法。

答案 2 :(得分:2)

如果我想要一个强大的解决方案,我可能只会使用boost::regex_replace

// regex with illegal characters
std::string output = boost::regex_replace(str, "[!@#%]", " ");

Documentation

答案 3 :(得分:2)

我会尝试这样的事情:

std::replace(str.begin(), str.end(), 0x46, 0x32);

您甚至可以在原始环境中执行此操作,无需单独的功能。您需要#include <algorithm>

答案 4 :(得分:0)

您是否希望从std::string删除/替换特定字符的每个实例?如果是这样,请参阅以下类似问题:

How to replace all occurrences of a character in string?

Remove spaces from std::string in C++

只需使用答案中显示的概念来满足您自己的目标。

相关问题