如何从C中的字符串中删除给定索引处的字符?

Fav*_*las 45 c string

如何从字符串中删除字符?

如果我有字符串"abcdef",我想删除"b"我该怎么做?

使用以下代码可以轻松删除第一个字符:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
   char word[] = "abcdef";
   char word2[10];

   strcpy(word2,&word[1]);

   printf("%s\n", word2);

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

strncpy(word2,word,strlen(word)-1);
Run Code Online (Sandbox Code Playgroud)

将给我没有最后一个字符的字符串,但我仍然没有弄清楚如何删除字符串中间的字符.

sta*_*ker 57

memmove 可以处理重叠区域,我会尝试类似的东西(未测试,可能+ -1问题)

char word[] = "abcdef";  
int idxToDel = 2; 
memmove(&word[idxToDel], &word[idxToDel + 1], strlen(word) - idxToDel);
Run Code Online (Sandbox Code Playgroud)

之前: "abcdef"

后: "abdef"


Fab*_*ral 38

试试这个 :

void removeChar(char *str, char garbage) {

    char *src, *dst;
    for (src = dst = str; *src != '\0'; src++) {
        *dst = *src;
        if (*dst != garbage) dst++;
    }
    *dst = '\0';
}
Run Code Online (Sandbox Code Playgroud)

测试程序:

int main(void) {
    char* str = malloc(strlen("abcdef")+1);
    strcpy(str, "abcdef");
    removeChar(str, 'b');
    printf("%s", str);
    free(str);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果:

>>acdef
Run Code Online (Sandbox Code Playgroud)


tBl*_*abs 9

我删除所有指定字符的方法:

void RemoveChars(char *s, char c)
{
    int writer = 0, reader = 0;

    while (s[reader])
    {
        if (s[reader]!=c) 
        {   
            s[writer++] = s[reader];
        }

        reader++;       
    }

    s[writer]=0;
}
Run Code Online (Sandbox Code Playgroud)

  • 赞成良好的结构和变量名称,与上面的简洁变体相比,能够更容易地遵循此代码。谢谢 (5认同)

MD *_* XF 6

真的很惊讶这之前没有发布过。

strcpy(&str[idx_to_delete], &str[idx_to_delete + 1]);
Run Code Online (Sandbox Code Playgroud)

相当高效和简单。strcpy用于memmove大多数实现。

  • 这是未定义的行为。正如 C99 第 7.21.2.3 节(“strcpy 函数”)所解释的那样,“如果在重叠的对象之间进行复制,则行为是未定义的。” 至于“在大多数实现上”使用 `memmove` - [需要引用]。 (4认同)

Sar*_*nKS 5

char a[]="string";
int toBeRemoved=2;
memmove(&a[toBeRemoved],&a[toBeRemoved+1],strlen(a)-toBeRemoved);
puts(a);
Run Code Online (Sandbox Code Playgroud)

试试这个 .memmove会重叠它.测试.