【问题标题】:Function to trim non, alphabetic, numeric characters from character array [closed]从字符数组中修剪非字母数字字符的功能[关闭]
【发布时间】:2012-11-04 22:43:30
【问题描述】:

我正在寻找具有以下原型的 C++ 函数:

char *trim(char *string)

我希望这个函数做的事情如下:

  • 修剪所有非字母、数字字符
  • 如果遇到空格,就是修剪空格和附加字符
  • 返回修剪后的字符数组

例子:

输入:*&^!@^ThisIsA#Test String;'{><,.

输出:ThisIsATest

【问题讨论】:

  • 你的意思是std::string trim(char const * str)
  • 绝对可以在 SO 中找到 trim
  • 好吧,有趣,那么祝你好运。
  • 好吧,我现在看到我的问题是多么含糊,所以我对其进行了编辑。希望它更有意义。

标签: c++ char


【解决方案1】:

一个选项是std::copy_if 将好的字符复制到返回缓冲区:

char *trim(const char *str) {
    std::size_t len = strlen(str);

    char *ret = new char[len + 1]{}; //allocate space and initialize
    std::copy_if(
        str, //from beginning
        std::find(str, str + len, ' '), //to first space (or end)
        ret, //copy to beginning of buffer
        isalnum //the alphanumeric characters
    );

    return ret; //return the buffer
}

int main() {
    std::cout << trim("ab$#h%#.s354,.23nj%f abcsf"); //abhs35423njf
    std::cout << trim("adua9d8f9hs.f,lere.r"); //adua9d8f9hsflerer
}

请注意,我的示例完全忽略了您必须释放在trim 中分配的内存这一事实,在这种情况下这没问题,因为程序马上结束。我强烈建议您将其更改为使用std::string。由于std::beginstd::end 的兼容性,它既简化了trim 的定义,又为您管理内存。

【讨论】:

  • 您需要强制转换以选择isalnum()的正确重载。我同意string 更好:copy_if(s.begin(), find(s.begin(), s.end(), ' '), back_inserter(result), static_cast&lt;int(*)(int)&gt;(isalnum)); 或更一般的find_if()isspace()
  • @JonPurdy,您确定需要投射吗? GCC 什么也没给我。无论如何,我确实考虑过isspace,我同意这是一个合适的替代品。我只是想用问题的措辞,但这是一个很好的提及。
  • 我不得不投给 Ideone。不过,我将标题包含为&lt;cctype&gt;;如果您使用&lt;ctype.h&gt;,则行为可能会有所不同。
  • @JonPurdy,我也使用了&lt;cctype&gt;。 4.7.2,供参考。 VS11 给我的只是通常的警告,因为它可能不安全(尽管在这种情况下应该是这样),而且看起来 llvm.org/demo 没有 copy_if
  • @chris 当前错误我收到“C2143:语法错误:缺少';'在此行的“{”之前char *ret = new char[len + 1]{}; 和“C2039:'copy_if':不是'std'的成员”。我正在 VS 中进行测试,但会将其部署在 IMB 中档机器上
【解决方案2】:

不确定这是否是最好的方式,性能方面,但它对我来说是最合乎逻辑的方式。 copy_if 似乎不存在。但是查看 ASCII 表 www.asciitable.com 我循环遍历字符数组,只将字母数字字符复制到我的字符串对象,直到我找到一个空格或到达数组的末尾。

char *trim(char *str)
{
    std::size_t len = strlen(str);

    string temp = "";

    for (size_t k = 0; k < len; k++)
    {
            // If space found end the process
            if(str[k] == 32)
            {
                break;
            }
            else if ((str[k] >= 48) && (str[k] >= 57)) // numbers
            {
                temp += str[k];
            }
            else if ((str[k] >= 65) && (str[k] >= 90)) // uppercase letters
            {
                temp += str[k];
            }
            else if ((str[k] >= 97) && (str[k] >= 122)) // lowercase letters
            {
                temp += str[k];
            }
    }

    // Convert String to char*
    char * writable = new char[temp.size() + 1];
    std::copy(temp.begin(), temp.end(), writable);
    writable[temp.size()] = '\0';

    return writable;
}          

从这里 convert-stdstring-to-const-char-or-char 得到将字符串转换为 char* 的想法

【讨论】:

    猜你喜欢
    • 2011-07-12
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 2013-02-01
    • 2012-12-27
    • 1970-01-01
    相关资源
    最近更新 更多