我想要一个string(可以包含空格)作为input。 我想做dynamic分配。 我的程序结构有点像这样。
#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; }
我想知道如何得到input。 有什么办法可以让fgets的第二个参数是dynamic的吗?
使用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
的附加字段struct msgclient
注意你可能会考虑使用GNU readline 。 它提供版本和完成设施(从码头读取时)。