在char数组的中间插入字符

时间:2012-02-14 23:08:53

标签: c arrays insert char

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

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

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

char ch[15]; // assume it has "HelloWorld" in it
for(int i=0; i<=strlen(ch)-1; i++) {
    if(ch[i]=='o' && ch[i+1]=='W') {
        for(int j=strlen(ch)-1; j>=i+2; j--) {
            ch[j] = ch[j-1]; // pushing process?
        }
        ch[i+1] = '.';
        break;
    }
}

这会有用吗?会有更简单的方法吗?我可能只是觉得这太复杂了。

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

如果您想将所有字符向上移动一个,则可以使用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)
);

答案 2 :(得分:1)

简单地说:

#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

答案 3 :(得分:1)

内循环的初始起始值是一个短。它应该类似于以下内容。另请注意,由于字符向右移动,因此需要添加新的null终止符:

    ch[strlen(ch) + 1] = '\0';
    for(j=strlen(ch); j>=i+2; j--) {  // note no "-1" after the strlen

编辑至于“这是一个好方法吗?”部分,我认为这是合理的;它只取决于预期的目的。想到几个想法:

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

答案 4 :(得分:0)

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

char ch[15];

你正在硬编码数组,总是有15个字符。将它作为指针将是第1步:

char* ch;

这样您可以根据需要进行修改。