最近写C问题越来越多啊啊。

时光诺下的雨丶 2017-06-12 10:00:18

想实现先输入姓名、编号、性别,
再通过编号识别出是老师,还是学生,
如果是学生就输入所在班级,
如果是老师,就输入老师的职务,


输入代码如下,为什么每次并没有输入完成就结束了?
	int r;
scanf("%d", &r);
printf("请输入他们的信息*姓名**号码**性别*\n");
int i;
for (i = 0; i < r; i++)
{
scanf("%s%d%c", x[i].name, &x[i].num, &x[i].sex);
if ((int)(x[i].num / 1000) == 1)
{
strcpy(x[i].job, "学生");
printf("请输入该%s所在班级:", x[i].job);
scanf("%d", &x[i].jx.class);
}
else if ((int)(x[i].num / 1000) == 2)
{
strcpy(x[i].job, "老师");
printf("请输入该%s的职务:", x[i].job);
scanf("%s", x[i].jx.position);
}
}



很不好意思,最近总感觉问题越来越多了,自己也跳不出来。
昨天也有个double型,控制5.2输出平均成绩,小数点后面被舍弃变成 .00 也搞不懂,
好累,求帮忙
...全文
187 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 5 楼 cfjtaishan 的回复:
scanf("%s%d %c", x[i].name, &x[i].num, &x[i].sex);
加一个空格即可,因为%c可以匹配空格,所以再输入num之后再输入sex时,你加了一个空格(这个是必要的),但是%c正好匹配到了这个空格,所以现在要在scanf中加一个空格,这样后面的输入就可以匹配%c了
谢谢,谢谢。
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
//请今后要用
char c;
scanf("%c",&c);
//时,都改为
char s[2];
char c;
scanf("%1s",s);
c=s[0];
能解释一下这样的用意吗?不是很懂。 萌新
赵4老师 2017-06-13
  • 打赏
  • 举报
回复
在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
//请今后要用
char c;
scanf("%c",&c);
//时,都改为
char s[2];
char c;
scanf("%1s",s);
c=s[0];
自信男孩 2017-06-13
  • 打赏
  • 举报
回复
scanf("%s%d %c", x[i].name, &x[i].num, &x[i].sex);
加一个空格即可,因为%c可以匹配空格,所以再输入num之后再输入sex时,你加了一个空格(这个是必要的),但是%c正好匹配到了这个空格,所以现在要在scanf中加一个空格,这样后面的输入就可以匹配%c了
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
[quote=引用 7 楼 jtidni 的回复:] [quote=引用 6 楼 zhao4zhong1 的回复:] 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
//请今后要用
char c;
scanf("%c",&c);
//时,都改为
char s[2];
char c;
scanf("%1s",s);
c=s[0];
能解释一下这样的用意吗?不是很懂。 萌新[/quote] 百度搜相关关键字。[/quote] 知道了,谢谢~
  • 打赏
  • 举报
回复
引用 10 楼 cfjtaishan 的回复:
scanf中sex是字符串吧,既然用%s输入,就没有必要加& fflush(stdout)和rewind(stdin)没必要加
sex临时改的,我输入的汉字,没用W女M男代替,之前定义的sex 然后%c输入汉字,出错了, 我才把定义成sex[10]的,后面忘改输入了,,哈哈。 谢谢了,我去改正确。 哦,那个不加fflush(stdout)和rewind(stdin)还是没法完成输入。我不知道那应该加,所以我全加了,然后就正确了
赵4老师 2017-06-13
  • 打赏
  • 举报
回复
引用 7 楼 jtidni 的回复:
[quote=引用 6 楼 zhao4zhong1 的回复:] 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
//请今后要用
char c;
scanf("%c",&c);
//时,都改为
char s[2];
char c;
scanf("%1s",s);
c=s[0];
能解释一下这样的用意吗?不是很懂。 萌新[/quote] 百度搜相关关键字。
赵4老师 2017-06-13
  • 打赏
  • 举报
回复
引用 10 楼 cfjtaishan 的回复:
scanf中sex是字符串吧,既然用%s输入,就没有必要加& fflush(stdout)和rewind(stdin)没必要加
自信男孩 2017-06-13
  • 打赏
  • 举报
回复
scanf中sex是字符串吧,既然用%s输入,就没有必要加& fflush(stdout)和rewind(stdin)没必要加
  • 打赏
  • 举报
回复


谢谢各位大佬,在各位的帮助下,已经调试完成了





  • 打赏
  • 举报
回复
知道了明天我试试,谢谢
LubinLew 2017-06-12
  • 打赏
  • 举报
回复
不加空格, %c 就取到空格了
LubinLew 2017-06-12
  • 打赏
  • 举报
回复

scanf("%s%d%c", x[i].name, &x[i].num, &x[i].sex);
//改为(加上空格)
scanf("%s %d %c", x[i].name, &x[i].num, &x[i].sex);
  • 打赏
  • 举报
回复
在这里谢谢了,谢谢各位大佬,我不想这么轻易就来论坛的,但确实找不到问题。感觉这两天写脑袋越来越昏。

69,371

社区成员

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

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