这段代码中字符串的大小会发生什么变化?

what will be happen to the size of string in this code?

#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,未填充的 space 将被浪费,如果是这样如何减小大小。
  2. 如果字符串 2 malloc 大小参数为 10,fgets 大小参数为 10,如果我将大小增加到大于 malloc 大小的 fgets(string2,50,stdin) 会发生什么情况?
  3. 如何在每种情况下计算输入字符串的最终大小?我使用了 sizeof 运算符,但它给出了 string1 和 string2 的硬编码大小分别为 50 和 10
  4. 有没有其他更好的方法来创建动态字符串?
  1. 是的,它会被浪费掉。您可以使用可变长度数组来使用不同的限制,或使用动态分配。您是否应该担心浪费的 space 是一个单独的问题:如果您的程序读取用户手动输入的字符串(而不是读取文件),您可能会在它之前浪费很多 space开始很重要,除非您使用的是具有严格内存限制的嵌入式系统。
  2. 您将得到未定义的行为,因此您的程序将无效。不要那样做 - 这正是 fgets 占用字符串最大长度的原因。
  3. 调用strlen计算字符串的长度。为空终止符添加 1。请记住,当您使用 fgets 并且输入中包含 '\n' 时,'\n' 是字符串的一部分。
  4. 您可以对 scanf 使用 POSIX 扩展,并传递 %ms 格式和指向 char* 的指针。这将以准确的长度分配字符串,但您的程序的可移植性会降低。显然,您需要释放这些字符串以避免内存泄漏。