【问题标题】:C check if space exists in array, if not reallocate more space?C检查数组中是否存在空间,如果不重新分配更多空间?
【发布时间】:2020-02-29 09:05:54
【问题描述】:

我必须编写一个程序,它接受一个字符串参数,例如“abcd”,并返回一个新字符串,例如“a-bb-ccc-dddd”。所以对于字符串中的每个字符,在新字符串中增加它的重复。

在 C# 或 Java 中,我只会使用 StringBuilder,但在 C 中,我不确定如何检查字符串是否有足够的空间容纳新字符。如果没有,请重新分配。

       char *str = malloc(strlen(source) * sizeof(char));
       for (int i = 0; i <= strlen(source) - 1; i++)
               (for int j = 0; j < i + 1; j++)
                 if (space_exists_in_string(source))
                     str[j] = source[i]; 
                 else {
                    str = realloc(str, strlen(str) * 2);
                    str[j] = source[i]
                 }

所以基本上我正在寻找一种方法来检查是否(space_exists_in_string)。

谢谢

【问题讨论】:

  • 您必须使用变量来跟踪自己。例如:size_t bytes = strlen(source); str = malloc (bytes);。后来:bytes *= 2; str = realloc(str, bytes);
  • 为什么不预先分配最终字符串的完整大小?从您的示例看来,您似乎可以计算出等于n * (n + 1) / 2 的第一个n 数字(其中n 是字符串的长度)的总和加上'-' 的数量,即@ 987654327@.

标签: c arrays string memory malloc


【解决方案1】:

如果数组被声明为字符数组,比如char arr[],你可以调用sizeof(arr),你会得到数组的大小。但是,如果使用 malloc 或 calloc 为其分配了一些堆内存,则无法获取数组的大小,除非调用 strlen(),它只给出字符串的大小,而不是内存位置。因此,要么将字符串声明为字符数组,要么存储创建的内存大小(动态创建时)并在每次扩展/收缩内存时更新它。

在您的情况下,我认为如果您为输出分配一些存储空间并遍历输入并将数据插入到输出中会很简单。这样,您就知道要分配多少数据给输出,而无需扩展它。您的输出所需的空间为(1 + 2 + 3 + 4 + 5 +... strlen(input) times) + (strlen(input)-1)

【讨论】:

  • 即,第一个 strlen(input) 自然数的总和 + (strlen(input) - 1) for '-'。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多