一个用scanf出现的奇怪问题,哪位大哥帮我解决一下吧。

gaoshoulei 2005-05-22 08:58:51
#include "stdio.h"
#include "iostream.h"
#define N 100

long xh[N]; // 学号
char xm[N][20]; //姓名,
int sx[N],cx[N],sum[N],num,flag=0;//数学成绩,程序设计成绩,总分,记录的个数, 是否新建了数据

int create()
{
int n,i,j;
char k;
if(flag==1)
{
printf("数据已经被新建了,要重新初始化吗(Y/N)?\n");
scanf("%c",&k);
if(k!='Y'&&k!='y')return 0;

}
i=0;j=0;
printf("请输入要新建的学生数据的个数: ");
scanf("%d",&n);
num=n;
while(i<n)
{
printf("请输入学生的学号: ");
scanf("%ld",&xh[i]);
while(j<i)
{
if(xh[i]==xh[j])
{
printf("输入的学号有重复,请重新输入学号: ");
scanf("%ld",&xh[i]);
j=0;
}
else j++;
}
printf("请输入学生的姓名: ");
scanf("%s",xm[i]);
printf("请输入学生的数学成绩: ");
scanf("%d",&sx[i]);
printf("请输入学生的程序设计成绩: ");
scanf("%d",&cx[i]);
sum[i]=sx[i]+cx[i];
i++;
}
flag=1;
return 1;
}
void main()
{
int a=0;//选择序号
while(a!=6)
{
printf("1.新建数据\n");
printf("2.添加数据\n");
printf("3.删除数据\n");
printf("4.排序\n");
printf("5.查询\n");
printf("6.退出\n\n");
printf("请输入1—6的整数,选择你要进行的操作:");
scanf("%d",&a);
switch(a)
{
case 1: create();
}
}

scanf("%d",&a);
}

请大家注意:create()函数的第7行scanf("%c",&k);

编译运行程序,开始后新建程序,建立一个学生的就够了,然后回到主界面再选1.新建程序,为什么
scanf("%c",&k);这句话就像不存在一样直接就从函数中跳出来了?如果把这句话改成cin>>k;就一切正常了?这是为什么啊?我要交的是C语言的作业,不是C++的作业,不能用cin函数,哪位大哥能告诉我问题出在哪里吗?
...全文
141 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaoshoulei 2005-05-23
  • 打赏
  • 举报
回复
经过我试了各种方法,都没有成功,终于我在另外一个地方看到了答案,

“显然在上一次输入后没有象正常情况一样清除输入缓冲区,这样第二次执行scanf时,程序并没有让你输入而是直接读入上次输入的结果。如果你一定要这么做,应该在scanf之前加上:
fflush(stdin);
这样清楚掉键盘缓冲区。 ”
别人告诉我的,我一用真的可以,正好巧合,另外一个地方要输入字符串的地方也碰到这个问题,还是用fflush(stdin); 解决的。
非常感谢大家对我的帮助。现在结贴了。
sTigerwsk 2005-05-22
  • 打赏
  • 举报
回复
我觉得你应该把k定义为一个局部变量
最好应该为int 类型的
放在
if(flag==1)
{
int k;
printf("数据已经被新建了,要重新初始化吗(Y/N)?\n");
//cin>>k;
scanf("%d",&k);
//k=getchar();
if(k!='Y'&&k!='y')
flag=0;
}
这儿试试
gaoshoulei 2005-05-22
  • 打赏
  • 举报
回复
我在scanf("%c",&k);后面加了一句printf("%d",k);输出是10
查表得,此ASC2码 是 <line feed>,就是被莫名其妙的输入了一个 <line feed>
gaoshoulei 2005-05-22
  • 打赏
  • 举报
回复
在main()函数case语句下加入:

case '\0':
case ' ': break;

可以屏蔽调回车和空格键
——————————————————————
按这个方法做了 还是不行!


getchar()也试过了,结果和用scanf一样
gaoshoulei 2005-05-22
  • 打赏
  • 举报
回复
确实是不为字符Y就返回啊,没有错,
我是想让他 按Y就继续执行这个函数
zhousqy 2005-05-22
  • 打赏
  • 举报
回复
不要用scanf读取交互式的输入。可以用getchar()什么的。
robot_wind 2005-05-22
  • 打赏
  • 举报
回复
在main()函数case语句下加入:

case '\0':
case ' ': break;

可以屏蔽调回车和空格键
lbing7 2005-05-22
  • 打赏
  • 举报
回复
这位大哥

你看一下你的这句是什么?

if(k!='Y'&&k!='y')return 0;

你的字符不为Y的话就返回,
你的意思是为Y才返回吧!
gaoshoulei 2005-05-22
  • 打赏
  • 举报
回复
printf("数据已经被新建了,要重新初始化吗(Y/N)?\n")里的“\n”没有影响,狂郁闷啊
改成了getchar()还是出现同样的问题!根本不给输入的机会!
gaoshoulei 2005-05-22
  • 打赏
  • 举报
回复
好的 大哥 我试试 试完再来看看
ewayne 2005-05-22
  • 打赏
  • 举报
回复
回车也是字符!
输入字符时要小心处理,最好转化为数字!
lbing7 2005-05-22
  • 打赏
  • 举报
回复
可以用getch(),或者getchar()
lbing7 2005-05-22
  • 打赏
  • 举报
回复
scanf("%c",&k);

用%C的话
可能会读进'\n',这个是你的回车符
给自己下圈套了!

69,373

社区成员

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

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