关于c ++:如何推送char数组?

How to push char array?

本问题已经有最佳答案,请猛点这里访问。

0

我不知道如何推送char数组。例如,如果char数组中有"hi.my.name.is",我想把一个木炭放在中间,然后把它推到右边。所以应该是"嗨,我的,砰,是"之类的。

有什么可能的解决办法吗?


使用string::insert

1
2
std::string s("test");
s.insert(s.begin()+2, 'c');


没有"自动"推送可以重新定位数组中的元素。在最低级别,只有从数组元素中读取并写入数组元素。

这意味着您需要在数组中插入"一个索引"之后复制每个元素。然后需要在插入的索引处设置"inserted"值。

库例程将在您不注意的情况下为您执行此操作;但是,您应该了解底层机制。否则,您可能会有这样的印象:在任意索引处插入数组是很便宜的(通常情况下不是这样)。


如果限制为C字符串或要求在缓冲区中替换它,那么可以执行如下操作,但缓冲区必须足够大,以容纳修改后的字符串,因为它会将所有字符向下推。也就是说,你最好像其他人建议的那样使用std::string

1
2
3
4
5
6
7
8
9
10
11
// ASSUMES buffer is large enough to store one more char
void insertAt(char* buffer, char insertMe, size_t at)
{
    size_t len = strlen(buffer);

    if (at <= len)
    {
        memcpy(buffer + at + 1, buffer + at, len - at + 1);
        buffer[at] = insertMe;
    }
}

要做到这一点,你必须:

  • 创建一个足够大的新数组来保存原始项和新项。无法调整数组的大小。
  • 将旧数组中的所有项复制到新数组中,使新字符的位置保持打开状态。
  • 插入新字符。
  • 这很复杂。但是C++提供了一种更简单的方法-EDCOX1,1:

    2

    这个程序打印HI.MY.SLAME.IS。或者,更好的方法是使用insert,正如@rasmus所建议的。


    1
    2
    3
    4
    5
    6
    7
    8
    9
    //This allocates new memory that you receive responsibility for freeing after use.
    char *push(char *charArray, char *charsToPush, int pushPos) {
        char *thePushed = new char[strlen(charArray) +  strlen(charsToPush) + 1];
        memcpy(thePushed, charArray, pushPos);
        memcpy(thePushed + pushPos, charsToPush, strlen(charsToPush));
        memcpy(thePushed + pushPos + strlen(charsToPush), charArray + pushPos, strlen(charArray) - pushPos);
        thePushed[strlen(charArray) +  strlen(charsToPush)] = '\0';
        return thePushed;
    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    char* string = (char*) malloc(14);
    string ="HI.MY.NAME.IS";
    realloc(string, 15);
    for (int i = 14; i > 5; --i) {
        string[i+1] = string[i];
    }

    string[5] = 'S';
    string[6] = 'L';

    给你……哈哈