我在下面使用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
这个小问题在一个更大的问题中是一个更大的问题,所以这只是较大问题的一个缩影。
答案 0 :(得分:2)
您还没有为b
分配空间,fgets()
期望它的第一个参数指向足够的内存来存储结果,足够的是,您传递给它的大小作为第二个参数
如果size参数为1
,fgets()
正在读取一个空字符串,则需要它至少为3
,因为fgets()
需要空间'\n'
和终止nul
。
所以试试这个
char b[3];
fgets(b, sizeof(b), stdin);
*M->num = atoi(b);
在尝试对指针执行任何操作之前,您必须检查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
。