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

58

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

如果我有字符串"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;
}

并且

strncpy(word2, word, strlen(word) - 1);

使用 slice 方法可以让我得到一个去掉最后一个字符的字符串,但是我仍然不知道如何删除中间的字符。


给定字符的所有出现次数:https://dev59.com/VVHTa4cB1Zd3GeqPU9SX - Ciro Santilli OurBigBook.com
22个回答

0

我很惊讶在过去的十年里,没有任何一个回答提到这一点:

  • 使用strncpy(word2, word, strlen(word)-1);复制字符串时,不包括最后一个字节是错误的:空终止符将不会设置在word2[strlen(word) - 1]处。此外,如果word是一个空字符串(没有最后一个字符),这段代码会导致崩溃。

strncpy函数不适合解决这个问题。事实上,它不推荐用于任何问题,因为如果n参数小于或等于源字符串长度,则不会在目标数组中设置空终止符。

这里有一个简单的通用解决方案,可以复制一个字符串并删除偏移量为pos的字符,而不假设pos是字符串内的有效偏移量:

#include <stddef.h>

char *removeat_copy(char *dest, const char *src, size_t pos) {
    size_t i;
    for (i = 0; i < pos && src[i] != '\0'; i++) {
        dest[i] = src[i];
    }
    for (; src[i] != '\0'; i++) {
        dest[i] = src[i + 1];
    }
    dest[i] = '\0';
    return dest;
}

如果dest == src,此函数也可以工作,但是为了在可修改的字符串中就地删除字符,请使用这个更高效的版本:

#include <stddef.h>

char *removeat_in_place(char *str, size_t pos) {
    size_t i;
    for (i = 0; i < pos && str[i] != '\0'; i++)
        continue;
    for (; str[i] != '\0'; i++)
        str[i] = str[i + 1];
    return str;
}

最后,这里是使用库函数的解决方案:
#include <string.h>

char *removeat_copy(char *dest, const char *src, size_t pos) {
    size_t len = strlen(src);
    if (pos < len) {
        memmove(dest, src, pos);
        memmove(dest + pos, src + pos + 1, len - pos);
    } else {
        memmove(dest, src, len + 1);
    }
    return dest;
}

char *removeat_in_place(char *str, size_t pos) {
    size_t len = strlen(str);
    if (pos < len) {
        memmove(str + pos, str + pos + 1, len - pos);
    }
    return str;
}

-4
一种方便、简单和快速消除 \0 的方法是使用 strncpy 而不是 strcpy 来复制字符串的最后一个字符(\0)之前的部分:
strncpy(newStrg,oldStrg,(strlen(oldStrg)-1));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接