如何推送字符数组? [复制]

Posted

技术标签:

【中文标题】如何推送字符数组? [复制]【英文标题】:How to push char array? [duplicate] 【发布时间】:2012-03-06 07:04:39 【问题描述】:

可能重复:How do I use arrays in C++?

我不知道如何推送 char 数组。 例如,如果我在 char 数组中有“HI.MY.NAME.IS”, 我想在中间放一个字符并将字符向右推。 所以它会像“HI.MY.SLAME.IS”或类似的东西。

任何可能的解决方案?

【问题讨论】:

显示一些代码,很难理解你在说什么。但听起来你没有使用 C++,你想要 <string.h> 标头中的函数。 【参考方案1】:

使用string::insert

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

【讨论】:

最好用更合适的惯用解决方案来回答,而不是正确回答一个有问题的问题。这是 C++ 中更好的解决方案! 当然这假设他可以访问字符串头。 我试图用 char 数组,而不是字符串。 但我想这也可以。谢谢!【参考方案2】:

没有“自动”推送来重新定位数组中的元素。在最低级别,只有从数组元素读取和写入数组元素。

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

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

【讨论】:

【参考方案3】:
//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;

【讨论】:

【参考方案4】:

为此,您必须:

    创建一个足以容纳原始项目和新项目的新数组。数组无法调整大小。 将旧数组中的所有项复制到新数组中,留出新字符的位置。 插入新字符。

这是相当复杂的。但是 C++ 提供了一种更简单的方法 - std::string:

#include <string>
#include <iostream>

int main() 
  std::string text = "HI.MY.NAME.IS";
  std::string new_text = text.substr(0, 6) + "SL" + text.substr(7, 6);
  std::cout << new_text << std::endl;

这个程序打印HI.MY.SLAME.IS。或者,更好的是,使用insert,作为@rasmus suggests。

【讨论】:

【参考方案5】:

如果您仅限于 c 字符串或需要在缓冲区中替换它,那么您可以执行以下操作,但是您的缓冲区必须足够大以容纳修改后的字符串,因为它把所有角色都推倒了。也就是说,您最好按照其他人的建议使用std::string

// 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;
    

【讨论】:

【参考方案6】:
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';

给你...大声笑

【讨论】:

-1 newrealloc 不混合,realloc 和具有静态存储持续时间的数据也不混合。 正确,已修复。 “也没有 realloc 和具有静态存储持续时间的数据”是吧? string = "HI.MY.NAME.IS";之后,string指向的是静态存储时长的数据,对静态存储时长的数据调用realloc是非法的。也许你的意思是strcpy(string, "HI.MY.NAME.IS"); 我假设他是从某种输入机制接收到“HI.MY.NAME.IS”,只是把它放在那里。

以上是关于如何推送字符数组? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何验证字符串数组是不是包含某个字符串? [复制]

Vue如何将数组复制到本地进行编辑?为啥它适用于字符串而不适用于数组? [复制]

如何使用javascript将字符串数组转换为布尔值? [复制]

如何检查数组列表是不是包含特定的字符串值? [复制]

Javascript:如何使用字符串数组获取对象属性? [复制]

如何引用字符串数组中的字符串? [复制]