【问题标题】:Appending element into an array of strings in C将元素附加到C中的字符串数组中
【发布时间】:2015-06-24 07:40:08
【问题描述】:

我有一个给定大小的字符串数组,不使用任何内存分配,我如何在其中添加一些东西?

假设我运行代码,它正在等待您要输入的内容,您输入"bond",我如何将其附加到数组中?一个[10]?

【问题讨论】:

  • 数组不能改变大小。
  • 如果您只想为数组中的特定位置赋值,请参见:stackoverflow.com/questions/1088622/…
  • 只要做 A[10] = "bond";,假设数组是一个字符串
  • 正如其他人所说,如果数组是固定大小的,但有更多项目的空间,您需要使用计数器或哨兵跟踪最后一个项目(例如 '\0' 用于字符串,NULL 等),然后更新计数器/哨兵并插入项目。
  • 您可能还想看看这个。 [stackoverflow.com/questions/5406935/…

标签: c append c-strings strcpy strcat


【解决方案1】:

如果数组声明为like

char A[10];

然后您可以通过以下方式将字符串“bond”分配给它

#include <string.h>

//...

strcpy( A, "bond" );

如果你想在数组后面加上一些其他字符串,那么你可以写

#include <string.h>

//...

strcpy( A, "bond" );
strcat( A, " john" );

【讨论】:

    【解决方案2】:

    您不能追加到数组。当您定义数组变量时,C 会询问是否有足够的连续内存。这就是你得到的所有记忆。您可以修改数组的元素 (A[10]=5),但不能修改大小。

    但是,您可以创建允许追加的数据结构。最常见的两种是链表和动态数组。请注意,这些不是语言内置的。您必须自己实现它们或使用库。 Python、Ruby 和 JavaScript 的列表和数组都实现为动态数组。

    LearnCThHardWay 有一个关于链表的很好的教程,虽然关于动态数组的教程有点粗糙。

    【讨论】:

      【解决方案3】:

      你好,

      这真的取决于你所说的附加。

      ...
      int tab[5]; // Your tab, with given size
      // Fill the tab, however suits you.
      // You then realize at some point you needed more room in the array
      tab[6] = 5; // You CAN'T do that, obviously. Memory is not allocated.
      

      这里的问题可能是两件事:

      • 您是否误判了您需要的尺寸?在这种情况下,只需确保您提到的这个给定尺寸是正确“给定的”,但可能是这样。
      • 或者你一开始不知道你想要多少空间?在这种情况下,您必须自己分配内存!如果我可以说,没有其他方法可以动态调整内存块的大小

          #include &lt;stdio.h&gt;
          #include &lt;stdlib.h&gt;
          #include &lt;string.h&gt;
          #define STR_MAX_SIZE 255                                // Maximum size for a string. Completely arbitray.
      char *new_string(char *str) { char *ret; // The future new string;
      ret = (char *) malloc(sizeof(char) * 255); // Allocate the string strcpy(ret, str); // Function from the C string.h standard library return (ret); }
      int main() { char *strings[STR_MAX_SIZE]; // Your array char in[255]; // The current buffer int i = 0, j = 0; // iterators
      while (in[0] != 'q') { printf("Hi ! Enter smth :\n"); scanf("%s", in); strings[i] = new_string(in); // Creation of the new string, with call to malloc i++; } for ( ; j < i ; j++) { printf("Tab[ %d ] :\t%s\n", j, strings[j]); // Display free(strings[j]); // Memory released. Important, your program // should free every bit it malloc's before exiting }
      return (0); }


      这是我能想到的最简单的解决方案。这可能不是最好的,但我只是想向您展示整个过程。我可以使用 C 标准库 strdup(char *str) 函数来创建一个新字符串,并且可以实现我自己的快速列表或数组。

      【讨论】:

        【解决方案4】:

        数组变量的大小不能改变。追加到数组的唯一方法是使用内存分配。您正在寻找realloc() 函数。

        【讨论】:

        • 他特别说他有一个固定的数组。
        • @csl 我说它不能完成(注意我的措辞“数组变量”)。然后我继续解释如何通过更改先决条件来完成。请在将其视为错误之前阅读我的答案。
        • 他说“不使用任何内存分配”,所以我猜这意味着没有realloc。我唯一的猜测是他有一个预先分配的空间,并且应该使用备用空间。
        • 实际上,我认为,他有一个固定大小的空数组,想简单地在某个位置添加值。
        • @csl 同样,您似乎也没有阅读我的评论:在我回答的第一句话中,我解释说 OP 想要的东西无法完成。然后我解释如何通过改变问题的约束来回答问题。是的,OP 不想使用内存分配,但原因可能是 OP 害怕使用它,而不是使用它是错误的。
        【解决方案5】:

        如果你想给它附加一个字符或字符串;

        strcpy(a, "james")
        strcpy(a, "bond")
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-02
          • 2011-09-19
          相关资源
          最近更新 更多