C 字符的动态分配数组

C 字符的动态分配数组,c,dynamic-allocation,calloc,C,Dynamic Allocation,Calloc,我的目标是返回所需的句子大小。 i、 e输入大小=9,完整句子=“堆栈溢出”, 将返回“stack ov”(0/)这是到目前为止我得到的结果 #include <stdio.h> #include <stdlib.h> int main(void) { int size; char* A; printf("insert size you desired +1 :\n"); scanf ( "%d%*c", &size);

我的目标是返回所需的句子大小。 i、 e输入大小=9,完整句子=“堆栈溢出”, 将返回“stack ov”(0/)这是到目前为止我得到的结果

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int size;
    char* A;

    printf("insert size you desired +1 :\n");
    scanf ( "%d%*c", &size);
    A = calloc(size,sizeof(char));

    printf("insert full size sentence :\n");
    fgets ( A, size, stdin);

    printf("desired size sentence : %s\n",A);
    return 0;
}
#包括
#包括
内部主(空)
{
整数大小;
char*A;
printf(“插入所需大小+1:\n”);
scanf(“%d%*c”、&size);
A=calloc(大小,大小(字符));
printf(“插入全尺寸句子:\n”);
fgets(A、尺寸、标准尺寸);
printf(“所需大小的句子:%s\n”,A);
返回0;
}

已解决的

在分配给请求大小的缩减缓冲区中存储完整句子将溢出。要读取完整行,请使用
fgets()
而不是
scan()
在“字符串”中填充。请注意,
fgets()
也会读取最后一行字符。如果(fgets(A,size,stdin)!=0){printf(…);printf(…);},则可能需要
。使用
%s
scanf()
而不指定多少字节是可以的,这等于自杀;如果用户说
9
,然后键入
Heap Over Flow然后15个字符加上null将存储在分配的9个字节中-这不是幸福的秘诀。遗憾的是,您无法动态地告诉
scanf()
字符串有多大;您必须使用正确的大小信息格式化字符串并使用它。但是它太容易破坏你的程序。
fgets()
代码有一些小问题,但它是“安全的”。不要使用
gets()
它很容易出错,也不再是C的一部分。的可能重复