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