按索引从c中的字符串中删除字符

按索引从c中的字符串中删除字符,c,string,C,String,如何在不使用任何库的情况下从c中的字符串中删除某个字符 功能?我写的函数似乎有一个运行时错误,我不知道为什么 void remove_char(char* s,int index) { while(s[index+1] != 0) { s[index] = s[index + 1]; index++; } s[index] = 0; } 我还想知道是否有一种方法可以删除复杂度为1的字符?在不了解如何调用

如何在不使用任何库的情况下从c中的字符串中删除某个字符 功能?我写的函数似乎有一个运行时错误,我不知道为什么

void remove_char(char* s,int index)
{
    while(s[index+1] != 0)
       {
           s[index] = s[index + 1];
           index++;
       }
      s[index] = 0;
}

我还想知道是否有一种方法可以删除复杂度为1的字符?

在不了解如何调用函数的情况下,很难知道确切的故障模式。用char string[]调用它=这是一个字符串;,它工作得很好。但正如评论所指出的,一些其他形式的输入字符串可能会导致问题

我使用了以下实现,没有任何问题。它将删除指定字符的所有匹配项:

int RemoveCharFromString(char *orig, char c, char *newStr)
{
    if(!orig) return -1;
    if(!newStr) return -1;
    int i=0, j=0;

    while (*(orig+i) != '\0')
    {
        if (*(orig+i) != c)
        {
            *(newStr+j) = *(orig+i);
            j++;
            i++;
        }
        else i++;
    }
    *(newStr+j) = '\0';
    return 0;
}
或者,根据您的请求,此操作将删除指定索引处的字符:

int RemoveCharFromStringByIndex(char *orig, int index, char *newStr)
{
    if(!orig) return -1;
    if(!newStr) return -1;
    int i=0, j=0;

    while (*(orig+i) != '\0')
    {
        if (i != index)
        {
            *(newStr+j) = *(orig+i);
            j++;
            i++;
        }
        else i++;
    }
    *(newStr+j) = '\0';
    return 0;
}
注意,在这个实现中,newStr是由调用者创建的,并且必须包含足够的空间来包含结果

你当然可以用任何你需要的方式来适应这些。一项改进是将原型更改为:

char * RemoveCharFromString(char *orig, char c);


但是,如果您愿意,您可以这样做。

我总是喜欢这样从字符串中删除特定字符:

int RemoveCharFromString(const char *src, char *dst, char c)
{
    const char *s;
    char       *d;

    if ((char *)0 != src && (char *)0 != dst) {

        for (d = dst, s = src; (*d = *s); s++) {

            if (c != *d)
                d++;
        }

        return 0;
    }
    return 1;
}

仅当目标指针不等于被跳过的字符时,才递增目标指针。有时,您会直接使用传递的参数src和dst看到这一点,但早在某些编译器使用单独的指针生成更高效的代码的时候。常量只允许您传递常量字符串作为源,而不会产生编译器错误。

如何使用该函数?你传递什么参数,它们的值是什么?你能不能试着创建一个演示给我们看?您已经尝试过了吗?不能从复杂度为O1的字符串中间删除字符。该函数很好。问题在于如何称呼它。您正在传递指向字符串常量或数组的指针吗?前者将导致崩溃。。问题在于您没有显示的代码。这就是为什么您需要创建并向我们显示。@Dagan No,'\0'==0。转义0将整数值零的八进制表示插入到字符串或字符中。使用C++关键字(如新的C代码)可能会导致混淆。对于这两个评论,我将在接下来的几分钟内发表或删除答案。谢谢。@EugeneSh编辑以按索引添加版本。谢谢
int RemoveCharFromString(const char *src, char *dst, char c)
{
    const char *s;
    char       *d;

    if ((char *)0 != src && (char *)0 != dst) {

        for (d = dst, s = src; (*d = *s); s++) {

            if (c != *d)
                d++;
        }

        return 0;
    }
    return 1;
}