C语言scanf问题,急啊!~

来源:百度知道 编辑:UC知道 时间:2024/06/16 12:54:31
请各位高手帮我看哈下面这个程序,是结构体问题,可以运行,但是在学生名字中有空格就不正常了,所以请大家给我改一改,使它能够在学生名字有中有空格的情况下也能正常运行,谢谢了~!
#include<stdio.h>
void main()
{struct student{
char name[20];
float math;
float chinese;
float english;
float sum;}a[3];
float max;
int i,sign=0;
printf("input the name,math,chinese,english scores of students:\n");
for(i=0;i<3;i++)
{
scanf("%s%f%f%f",a[i].name,&a[i].math,&a[i].chinese,&a[i].english);
a[i].sum=a[i].math+a[i].chinese+a[i].english;}
max=a[0].sum;
for(i=1;i<3;i++)
{if(a[i].sum>max)
{max=a[i].sum;sign=i;}}
printf("what about the most excellent student:\n");
printf("%s %.3f %.3f %.3f",a[sign].name,a[sign].math,a[sign].chinese,a[sign].english);}
那个fflush(stdin);好像没有什么作用啊!~

大概滴看了一眼程序整体
楼主scanf函数里面 每个变量之间要有间隔的 就好比断句
比如说"%s,%f,%f,%f" 否则程序肯能会默认断句 造成识别出错
比方我打了一串name1.55.123.5 你认为程序断完之后会变成什么? 有可能就将整个字符串都划到%s 中 但是你在之前的输入中应该有敲空格之类的分隔符吧 那样虽然起到输入断句的作用 但是遇到想这种程序就不太管用了
所以 这里可以用楼上各位兄弟提到的gets gets判断是遇到回车符 所以输入的格式应该要改
如果想用scanf的话 scanf中变量那里也应该改成 "%s,%f,%f,....." 当然输入的时候也要输入name,12.4,324..... ","也可以换成别的字符 但是分隔符尽量使用名字中不会出现的字符 以免出现 Roy.Chen 这类的情况

程序呢,看不到啊

scanf("%s%f%f%f",a[i].name,&a[i].math,&a[i].chinese,&a[i].english);
换成

gets(a[i].name); fflush(stdin);
scanf("%f%f%f",&a[i].math,&a[i].chinese,&a[i].english);

再加上头 #include <stdlib.h>。你试试。

用scanf接收字符串的话,
在串首遇到空格的话,跳过,继续寻找下一个非空格字符,
在串中遇到空格时,结束字符串的输入。

所以如果用户输入" ab cd"的话,
scanf取得的字符串为"ab"。

而gets取得字符串时,是在遇到EOF(串尾)时停止
所以你如果名字中间想有空格的话你就要用gets 而不是scanf

scanf不是不显示空格,
而是用scanf接收字符串的话,
在串首遇到空格的话,跳过,继续寻找下一