使用C中的fgets输入动态大小

时间:2014-03-24 08:42:13

标签: c linux fgets

我希望有一个字符串(可以包含空格)作为输入。我想做动态分配。 我的程序结构有点像这样。

#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的第二个参数成为动态的?

1 个答案:

答案 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。它提供版本和完成设施(从终端阅读时)。