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
这个小问题是大问题中的大问题,所以这只是大问题的一个缩影。
您还没有为 b
分配 space,fgets()
期望它的第一个参数指向足够的内存来存储结果,足够了,大小你作为第二个参数传递给它。
大小参数为1
时,fgets()
读取的是一个空字符串,需要至少3
,因为fgets()
需要 space 用于 '\n'
和终止 nul
。
所以试试这个
char b[3];
fgets(b, sizeof(b), stdin);
*M->num = atoi(b);
你必须检查 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
.
我在下面有两个使用 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
这个小问题是大问题中的大问题,所以这只是大问题的一个缩影。
您还没有为
b
分配 space,fgets()
期望它的第一个参数指向足够的内存来存储结果,足够了,大小你作为第二个参数传递给它。大小参数为
1
时,fgets()
读取的是一个空字符串,需要至少3
,因为fgets()
需要 space 用于'\n'
和终止nul
。所以试试这个
char b[3]; fgets(b, sizeof(b), stdin); *M->num = atoi(b);
你必须检查
malloc()
没有 returnNULL
在尝试对指针做任何事情之前。
你有:
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
.