【问题标题】:what will be happen to the size of string in this code?这段代码中字符串的大小会发生什么?
【发布时间】:2016-08-06 21:28:35
【问题描述】:
#include <stdio.h>
#include <stdlib.h>


int main()
{
int size=10;
char string1[50];       
char *string2;
string2=(char *)malloc(size*sizeof(char));

fgets(string1,10,stdin);
printf("%s",string1);

fgets(string2,10,stdin);
printf("%s",string2);

}

这段代码中有两个字符串,一个是数组,另一个是使用指针动态创建的。

  1. 如果我输入的 string1 小于 50 且 string2 小于 10 将浪费未填充的空间,如果是这样如何减小大小。
  2. 如果字符串 2 malloc 大小参数为 10,fgets 大小参数为 10,如果我将大小增加到大于 malloc 大小的 fgets(string2,50,stdin) 会发生什么?
  3. 如何计算每种情况下输入字符串的最终大小?我使用了 sizeof 运算符,但它给出了 string1 和 string2 的硬编码大小分别为 50 和 10
  4. 还有其他更好的方法来创建动态字符串吗?

【问题讨论】:

  • 1) 是的。空间将被浪费。答:减少分配。至于问题标题:什么都没有。
  • 2)。碰撞。 3)问题不正确。第二个字符串的大小不是 10。它是指针的大小——通常是 4 或 8。
  • @WeatherVane 感谢您的意见:)
  • @WeatherVane:不,字符串不是指针。 sizeof string2 是指针的大小,但 string2 不是字符串。
  • @KeithThompson 这就是我说的,sizeof string2 是指针的大小。

标签: c dynamic malloc fgets


【解决方案1】:
  1. 是的,它会被浪费掉。您可以使用可变长度数组来使用不同的限制,或者使用动态分配。您是否应该担心浪费的空间是一个单独的问题:如果您的程序读取用户手动输入的字符串(而不是读取文件),您可能会在它开始变得重要之前浪费大量空间,除非您在具有严重内存限制的嵌入式系统。
  2. 您将获得未定义的行为,因此您的程序将无效。不要那样做 - 这正是 fgets 占用字符串最大长度的原因。
  3. 调用strlen 计算字符串的长度。添加1 作为空终止符。请记住,当您使用 fgets 并且输入中包含 '\n' 时,'\n' 是字符串的一部分。
  4. 您可以对scanf 使用POSIX 扩展,并传递%ms 格式和指向char* 的指针。这将以确切的长度分配字符串,但是您的程序的可移植性会降低。显然,您需要释放这些字符串以避免内存泄漏。

【讨论】:

  • 感谢您的输入。所以我不应该担心空间问题,对吧?如果他们认为我在我的代码中浪费内存,我会从朋友那里得到偏执的反应。感谢您的所有建议都奏效了。除了第四个,我会尝试后者
  • (2)中关于fgets()的说法不正确。 fgets() will read "at most size - 1 characters"
  • @HonzaRemeš 是的,我将它与 scanf 中的 %50s 混淆了。谢谢!
猜你喜欢
  • 2018-02-07
  • 1970-01-01
  • 2014-08-31
  • 2016-06-09
  • 1970-01-01
  • 2015-01-18
  • 2018-07-28
  • 1970-01-01
相关资源
最近更新 更多