C 字符数组中字符的插入

C 字符数组中字符的插入,c,arrays,insert,char,C,Arrays,Insert,Char,我有一个填充了一些字符的字符数组。假设我的字符数组中有“HelloWorld”。(不是字符串。占用0到9的索引) 我想做的是在数组的中间插入一个字符,然后把其余的推到一边,为正在插入的新字符腾出空间。 因此,我可以使char数组中包含“Hello.World” charch[15];//假设里面有“HelloWorld” 对于(int i=0;i=i+2;j--){ ch[j]=ch[j-1];//推送过程? } ch[i+1]='; 打破 } } 这样行吗?有没有更简单的方法?我可能只是想得

我有一个填充了一些字符的字符数组。假设我的字符数组中有“HelloWorld”。(不是字符串。占用0到9的索引)

我想做的是在数组的中间插入一个字符,然后把其余的推到一边,为正在插入的新字符腾出空间。

因此,我可以使char数组中包含“Hello.World”

charch[15];//假设里面有“HelloWorld”
对于(int i=0;i=i+2;j--){
ch[j]=ch[j-1];//推送过程?
}
ch[i+1]=';
打破
}
}

这样行吗?有没有更简单的方法?我可能只是想得太复杂了。

您需要从
strlen(ch)+1
开始内部循环,而不是
strlen(ch)-1
,因为您还需要将空终止符移动到正确的位置。请记住,
strlen
返回字符串的长度,以便
string[strlen(string)]=='\0'
;您可以将strlen看作是获取C字符串的空终止符索引的函数。

只需执行以下操作:

#define SHIFT  1
char bla[32] = "HelloWorld";    // We reserve enough room for this example  
char *ptr = bla + 5;            // pointer to "World"    
memmove(ptr + SHIFT, ptr, strlen(ptr) + 1);  // +1 for the trailing null

内环的初始起始值为短一个。它应该是如下所示。还要注意,由于字符向右移动,因此需要添加一个新的空终止符:

    ch[strlen(ch) + 1] = '\0';
    for(j=strlen(ch); j>=i+2; j--) {  // note no "-1" after the strlen
编辑至于“这是一个好方法吗?”部分,我认为是合理的;这取决于预期目的。我想到了几个想法:

  • 减少对斯特伦的呼叫可能是件好事。这可能取决于优化器的性能(可能有些优化器已经优化)。但每次调用strlen都需要扫描字符串以查找空终止符。在高流量代码中,这是可以加起来的。因此,将初始长度存储在变量中,然后在其他地方使用该变量可能会有所帮助
  • 这种类型的操作有可能导致缓冲区溢出。始终确保缓冲区足够长(在OP中)

如果要将所有字符向上移动一个字符,则可以使用
memmove
执行此操作

#include <string.h>

char ch[15];

int make_room_at = 5;
int room_to_make = 1;

memmove(
    ch + make_room_at + room_to_make,
    ch + make_room_at,
    15 - (make_room_at + room_to_make)
);
#包括
char-ch[15];
int make_room_at=5;
int room_to_make=1;
memmove(
ch+制造房间在+制造房间,
ch+在,
15-(制造房间+制造房间)
);

如果要操作字符数组,则不应将其设置为静态。通过这样做:

char ch[15];
您正在对数组进行硬编码,使其始终包含15个字符。将其设置为指针将是步骤1:

char* ch;

通过这种方式,您可以根据需要对其进行修改。

“对不起,我应该重新询问有关此主题的问题。”。阅读,这将帮助你得到你需要的答案。相关:@Johnsyweb:现在对我来说似乎是“不同”的问题。他请求帮助,取得了一些进展,但又陷入困境,并询问如何解决。哦,我真的很抱歉。我来读一遍it@amit:你说得对,我更新了我的评论。@Haxify我更新了我的答案以反映你更新的问题。
char* ch;