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

fgets does not prompt for user input. What is the difference?

我在下面有两个使用 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;
}

这是输出。请注意,它不会提示用户输入整数,它只是打印 "give me an integer",然后直接转到下一个打印语句。为什么要这样做?

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

Heres the num

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

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

  2. 大小参数为1时,fgets()读取的是一个空字符串,需要至少3,因为fgets() 需要 space 用于 '\n' 和终止 nul

    所以试试这个

    char b[3];
    
    fgets(b, sizeof(b), stdin);
    *M->num = atoi(b);
    
  3. 你必须检查 malloc() 没有 return NULL 在尝试对指针做任何事情之前。

你有:

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.