fgets不会提示用户输入。有什么不同?

时间:2015-04-19 20:52:56

标签: c string char stdin fgets

我在下面使用fgets有两个场景。两种方案都在同一个文件中,如下所示。

struct sth
{
    char str[10];
    int num; 
};

void getIt(struct sth **M){ 
    char *b;
    (*M)=malloc(sizeof(struct sth));

    printf("give me an integer:");
    fgets(b,1,stdin);  // output must be an address 
    (*M)->num = atoi(b);

    printf("give me a string:");
    fgets((*M)->str,10,stdin);

}


int main(int argc, char const *argv[])
{
    struct sth *myThing;
    getIt(&myThing);
    printf("Heres the string %s\n", myThing->str);
    printf("Heres the num \n", myThing->num);
    return 0;
}

这是输出。请注意,它不会提示用户输入整数,它只是打印"给我一个整数",然后直接移动到下一个print语句。为什么这样做?

give me an integer:give me a string:sdf
Heres the string sdf

Heres the num

这个小问题在一个更大的问题中是一个更大的问题,所以这只是较大问题的一个缩影。

2 个答案:

答案 0 :(得分:2)

  1. 您还没有为b分配空间,fgets()期望它的第一个参数指向足够的内存来存储结果,足够的是,您传递给它的大小作为第二个参数

  2. 如果size参数为1fgets()正在读取一个空字符串,则需要它至少为3,因为fgets()需要空间'\n'和终止nul

    所以试试这个

    char b[3];
    
    fgets(b, sizeof(b), stdin);
    *M->num = atoi(b);
    
  3. 在尝试对指针执行任何操作之前,您必须检查malloc()是否未返回NULL

答案 1 :(得分:2)

你有:

fgets(b,1,stdin);  // output must be an address 

但是,b必须是有效地址才能保存要读取的数据。使用您的代码,b被定义为指针,但它不指向任何有效地址。

有些事情:

char b[20]; // Make it large enough to hold the data

是必要的。

我不确定您为何使用fgets阅读数据并使用atoi将其转换为数字。另一种选择是使用fscanf