【发布时间】:2015-10-16 18:53:40
【问题描述】:
我是 C 世界的新手,我对 fgets() 函数有疑问。
我用谷歌搜索了将近 2 个小时的错误,找到了不同的解决方案,但没有一个有效。
我的班级太大了,不能只展示它的每个部分,但让我向你展示有问题的部分:
//... kivansag is a struct(!)
if(check == 1){
char name;
printf("Please give me your nickname!\n");
scanf("%s", &name);
strcpy(kivansag.name,&name);
char city;
printf("Please give me your city!\n");
scanf("%s", &city);
strcpy(kivansag.city,&city);
char *address = malloc(100);
printf("Please give me your address!\n");
fgets(address,100,stdin);
if((strlen(address)>0) && address[strlen(address)-1] == '\n'){
address[strlen(address)-1] = '\0';
}
strcpy(kivansag.address,address);
free(address);
}//...
问题是:每次我运行这段代码时,运行的服务器在写出“给我你的地址”后会跳过fgets(),并执行以下功能。
我可以得到任何建议吗?
更新:
现在我只有这个:
printf("Please give me your address!\n");
fgets(kivansag.address,sizeof(kivansag.address),stdin);
if((strlen(kivansag.address)>0) && kivansag.address[strlen(kivansag.address)-1] == '\n'){
kivansag.address[strlen(kivansag.address)-1] = '\0';
}
结构看起来像这样:
struct Kivansag{
//...
char address[100];
};
是的,仍然跳过我的部分...我也尝试使用fflush(stdin),以确保一切都清楚,但没有工作。
【问题讨论】:
-
char name;是一个有足够空间容纳 一个 字符的变量。 -
提示:什么样的字符不匹配
scanf("%s")(留在输入流中),但导致fgets()立即返回? -
始终检查 (!=NULL) malloc() 的返回值以确保操作成功。
-
函数 fflush() 仅用于输出流,不适用于标准输入。 C 标准明确指出
fflush(stdin)是未定义的行为。 -
这一行:
scanf("%s", &city);将失败,因为输入流中留下的换行符将阻止 scanf() 输入任何内容。建议阅读 scanf() 的手册页
标签: c whitespace scanf fgets