scanf的问题,比较奇怪。

eaglezhao 2003-12-10 02:24:54
我用scanf来读取一个字符,无论如何就是不能执行成功。
语句是这样的
char reply='y';
printf("\nDo you want to continue?(y/n):");
scanf("%c",&reply);
结果就是不能输入,在最后一句一直告诉我地址写错误。
后来我把最后一句改成scanf(" %c",reply);居然可以了。

谁能告诉我为什么?
说明:在main函数中单独这样写不会出错,有耐心的朋友看看我的代码。

#include <cstdio>
#include <iostream.h>

struct Student
{
char name[20];
int rollno,age;
};

void WriteData(char *filename);
void ReadData(char *filename);

int main(int argc,char *argv[])
{
/*
char a;
a='b';
printf("Enter a char:");
scanf("%c",&a); //!!!此处可以成功执行
printf("\nResult is %c\n",a);
*/
WriteData("c:\\student.dat");
// ReadData("c:\\student.dat");
return 0;
}

void WriteData(char *filename)
{
char reply;
Student li;
FILE *fp;
fp = fopen(filename,"w");
if (fp!=NULL)
{
do
{
printf("\nEnter your Roll No.:");
scanf("%d",&li.rollno);
printf("\nEnter your Name:");
scanf("%s",li.name);
printf("\nEnter your Age:");
scanf("%d",&li.age);
printf("%d %s %d \n",li.rollno,li.name,li.age);
fwrite(&li,sizeof(Student),1,fp);
printf("\nDo you want to continue(y/n):");
scanf(" %c",&reply); //!!!此处必须使用" %c",若使用"%c",则不能执行成功
} while (reply!='n');
fclose(fp);
}
}
...全文
31 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
eaglezhao 2003-12-12
  • 打赏
  • 举报
回复
感谢大家!
真是高手!心甘情愿结账。
Goldcastle 2003-12-10
  • 打赏
  • 举报
回复
对,你要先清除缓冲区,scanf("%c",&reply);或就用getchar();取数据。
arfi 2003-12-10
  • 打赏
  • 举报
回复
这是因为在执行了scanf("%d",&li.age);之后,键盘缓冲区中仍然留有一个字符,即你所按下的回车键,此时你使用"%c"接收的话,就会接收到一个回车符,因为它不是'n',程序继续循环。
如果你用" %c"接收,因为多了个空格,它会忽略掉一些空白符,如\t,空格,回车等等。将后面的字符赋给你的变量。
如果是接收"%d"之类的数,可能是自动忽略空白符。

你可以在scanf(" %c",&reply);之前加上fflush(stdin);(用来清空键盘缓冲区)
zhangfjj 2003-12-10
  • 打赏
  • 举报
回复
scanf(" %c",&reply); //!!!此处必须使用" %c",若使用"%c",则不能执行成功
???????
第一个多一个空格?是吧
我告诉你,在用scanf()函数输入char数据时,它会把回车换行符什么的都会当成有效数据,
正确的办法是在输入一个char后,用一个空的getchar()清除输入缓冲区
scanf();
getchar();
这样才会正确读入数据

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧