我希望有一个字符串(可以包含空格)作为输入。我想做动态分配。 我的程序结构有点像这样。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct msgclient
{
int msglen;
int msgtype;
char *cp;
}M1;
int main()
{
M1 *m;
m=malloc(sizeof(M1));
m->msglen=5;
m->msgtype=6;
printf("Enter\t");
fgets(m->cp,50,stdin); //here
// m->cp[strlen(m->cp)]='\0';
printf("\n%d\n%d\n",m->msglen,m->msgtype);
fputs(m->cp,stdout);
return 0;
}
我想知道如何获得输入。有没有办法让fgets的第二个参数成为动态的?
答案 0 :(得分:2)
使用getline(3) - 而不是fgets(3) - 它会读取动态分配的行。
typedef struct msgclient {
ssize_t msglen;
int msgtype;
char *cp;
}M1;
然后在您的main
函数
M1 *m;
m=malloc(sizeof(M1));
if (!m) { perror("malloc"); exit(EXIT_FAILURE); };
m->msglen=0;
m->msgtype=6;
m->cp = NULL;
printf("Enter\t");
fflush(stdout);
size_t msgsize = 0;
m->msglen = getline(&msg->cp, &msgsize, stdin);
您可以考虑将已分配的缓冲区大小(即msgsize
)添加为struct msgclient
的附加字段
请注意,您可能会考虑使用GNU readline。它提供版本和完成设施(从终端阅读时)。