【问题标题】:Inserting characters in the middle of char array在 char 数组中间插入字符
【发布时间】:2012-03-06 08:01:42
【问题描述】:

我有一个 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;
    }
}

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

【问题讨论】:

  • “对不起,我应该重新提问这个话题”。阅读Writing the perfect question,这将帮助您获得所需的答案。
  • @Johnsyweb:现在对我来说似乎是“不同”的问题。他寻求帮助,取得了一些进展,但又被卡住并询问如何解决。
  • 哦,我真的很抱歉。我会读一遍
  • @amit:你说得对,我已经更新了我的评论。

标签: c arrays insert char


【解决方案1】:

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

【讨论】:

  • @Haxify 我更新了答案以反映您更新后的问题。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

    char ch[15];
    

    您将数组硬编码为始终包含 15 个字符。使其成为指针将是第 1 步:

    char* ch;
    

    这样你可以根据需要修改它。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        简单地做:

        #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
        

        【讨论】:

          猜你喜欢
          • 2021-12-20
          • 2021-08-25
          • 2019-04-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多