返回信息流#include <stdio.h>
#include <string.h>
struct student /*定义一个结构体。*/
{
char name[20]; /*姓名。*/
int age; /*年龄。*/
int sex; /*性别。*/
int height; /*身高。 */
};
main()
{
/*定义一个结构体,表示有 50 个学生。*/
struct student stu[50];
int i=0; /*输入学生的计数。*/
int j; /*输出的计数。*/
char s; /*用户输入数据。*/
char name[20]; /*姓名。*/
/*进入一个 while 循环。*/
while(1)
{
printf("input a student?\nY/N:"); /*提示用户输入选择。*/
scanf("%c",&s); /*用户输入一个字符。*/
/*输入 N 或 n 则中断循环。*/
if(s=='N'||s=='n')
{
break; /*中止当前循环。*/
}
/*如果不是 N、n、Y、y 这几个字母则进入下次循环。*/
if(s!='y'&&s!='Y')
{
printf("error.\n"); /*输出提示。*/
continue; /*进入下一次循环。*/
}
printf("please input age:\n"); /*提示输入年龄。*/
scanf("%d",&stu[i].age); /*输入年龄。*/
printf("please input height:\n"); /*提示身高。*/
scanf("%d",&stu[i].height); /*输入身高。*/
printf("please input sex:\n"); /*提示性别。*/
scanf("%d",&stu[i].sex); /*输入性别。*/
printf("please input name:\n"); /*提示姓名。*/
scanf("%s",stu[i].name);
i++;
/*将字符串复制到学生姓名上。*/
/*计数器自加。*/
}
for(j=0;j<i;j++)
{
printf("Student[%d]\n",j); /*提示第几个学生。*/
printf(" Name :%s \n",stu[j].name); /*输出姓名。*/
printf(" Age :%d \n",stu[j].age); /*输出年龄。*/
printf(" Sex :%d \n",stu[j].sex); /*输出性别。*/
printf(" Height:%d \n",stu[j].height); /*输出身高。*/
}
}
编译以后执行结果如图
就是每次输入一个学生后总会多出一段提示
"input a student?
Y/N:error.
input a student?
Y/N:"
而第一段的"input a student?
Y/N:error."很明显是多余的,但是思路上我又无法解决怎么修正,麻烦各位帮看看,谢谢!
这是一条镜像帖。来源:北邮人论坛 / cpp / #41881同步于 2010/7/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
麻烦帮看个程序,谢谢
JacKie575
2010/7/28镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
慎用%c,可能会把空格、换行符读进来。而且你也许注意到了换行符在Windows里是2个字节,在Linux里是1个字节。所以预读一个%c试图把换行符读掉,也不总能正常工作。
建议:哪怕是读一个字符,也开一个足够长的缓冲区,用%s读。
char buf[256];
printf("Input a student?");
scanf("%256s",buf);
if(strcmp(buf,"y")==0) { ... }
eric卡带了……
【 在 ericyosho (ericyosho) 的大作中提到: 】
: 在每一个scanf的字符串里面,加上空格
: scanf(" %c")
: scanf(" %d")
: ...................