创建一个从字符串中删除某个字符的函数。我的计划有什么问题?

时间:2015-08-03 23:49:44

标签: c++ function while-loop

我正在尝试从字符串中删除所有G。我需要使用指针,但我的问题是我不知道用什么来替换找到的G。我不知道一个空字符常量('')不会编译。如何删除符合此代码的字符?

   void deleteG(char cString[])
{
    char *ptr;
    ptr = cString;
    while (*ptr != '\0')
    {
        if (*ptr == 'g' || *ptr == 'G')
        {
            *ptr = ' ';
        }
        ptr++;


}

}

4 个答案:

答案 0 :(得分:1)

正如@Captain Obvlious指出的那样,你的while循环永远不会结束,因为除非一封信是' g'或者' G'它永远不会增加指针。如果您在要评估的字母上放置断点,甚至使用std::cout,这很容易确定。

解决方案当然是将while循环更改为以下内容:

while (*ptr != '\0')
{
    if (*ptr == 'g' || *ptr == 'G')
    {
        *ptr = *(ptr+1);
    }
    ptr++;
}

虽然这解决了无限循环的问题,但更好的解决方案是使用标准库:std::string!因为我不能100%确定你要完成的任务,我将提供两个例子:

使用标准库删除所有大写字母

如果您的目标是删除所有大写字符,请考虑使用标准库:

bool IsUpper(char c)
{
    return !!std::isupper(c);
}

int main()
{
    std::string test = "Hello World :D";
    test.erase(std::remove_if(test.begin(), test.end(), IsUpper), test.end());
    return 0;
}

这使用std::string::erasestd::remove_if删除字符串中的所有大写字母。 std::remove_if采用开始和结束iterator(我们给它开始和结束我们的test字符串)和一个谓词(我们的函数IsUpper)将为每个调用容器中的元素(在这种情况下,char中的每个std::string 0)。如果谓词(IsUpper)为true返回char,则char将移至容器的后面。 std::remove_if将继续执行此操作,直到结束,然后它会将iterator返回到有问题的字符的开头(现在位于字符串的末尾)。
然后iterator使用std::string::erase,它采用开始和结束iterator(类似于std::remove_if)并删除该范围内的元素(在本例中为开头)字符串末尾的违规字符。) 你只剩下" ello orld:"

另请注意,我们的谓词IsUpper使用另一个标准库函数std::isupper来确定char是否为大写。

使用标准库删除所有 g &#39>

如果您的函数名称deleteG建议您尝试从字符串中删除 g 的所有实例,请考虑:

bool IsG(char c)
{
    return c == 'g' || c == 'G';
}

int main()
{
    std::string test = "GHelgglo gWorlgGd";
    test.erase(std::remove_if(test.begin(), test.end(), IsG), test.end());
    return 0;
}

与上面类似,但是我们已经将谓词(和test字符串)替换为一个函数,该函数告诉我们某个字符是否是 g :恰当地命名为{{ 1}}。
您将离开" Hello World"

答案 1 :(得分:1)

我推荐这样的东西......

void deleteAlpha(char cString[])
{
    const char *from = cString;
    char* to = cString;

    do
    {
        while (isalpha(*from))
            ++from;
    }
    while (*to++ = *from++);
}

请注意from遍历字符串,跳过字母字符,而to跟踪下一个非字母字符应“压缩”到的位置。 while循环条件会仔细复制终止NUL,即使它评估false并完成迭代。

答案 2 :(得分:0)

char* remove(char *s) {
    char *current = s;
    char *r = s; // 
    do {
        if ((*current < 'A') || (*current > 'Z') || (*current < 'a') || (*current > 'z')) {
            *r++ = *current;
        }
    } while (*current++ != 0);
    return s;
}

答案 3 :(得分:0)

我对c ++并不熟悉。尝试将指针递增到if语句之外,而不是在其中。然后它不会进入无限循环