gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:06:45 25 4
gpt4 key购买 nike

#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. 您将得到未定义的行为,因此您的程序将无效。不要这样做 - 这正是 fgets 采用字符串最大长度的原因。
  3. 调用strlen来计算字符串的长度。添加 1 作为空终止符。请记住,当您使用 fgets 并且输入中包含 '\n' 时,'\n' 是字符串的一部分。
  4. 您可以使用 scanf 的 POSIX 扩展,并传递 %ms 格式和指向 char* 的指针。这将以精确的长度分配字符串,但您的程序将不太可移植。显然,您需要释放这些字符串以避免内存泄漏。

关于c - 这段代码中字符串的大小会发生什么变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38808869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com