回 帖 发 新 帖 刷新版面

主题:输入问题

/* Note:Your choice is C IDE */
#include "stdio.h"
struct str
{
    char n[10];
    int a;
    int b;
    int c;
};
void main()
{
    int i;
    struct str b[2];
    for(i=0;i<2;i++)
    {
        printf("请输入第%d位的学号:",i+1);
        gets(b[i].n);
        printf("请输入该学生的三科成绩\n");
        scanf("%d%d%d",&b[i].a,&b[i].b,&b[i].c);
    }
    for(i=0;i<2;i++)
    {
        puts(b[i].n);
        printf("该学生的各科成绩为:\n");
        printf("%d  %d  %d\n",b[i].a,b[i].b,b[i].c);
        printf("平均成绩为:");
        printf("%d\n",(b[i].a+b[i].b+b[i].c)/3);
    }
    
}


请问各位,为什么没能输入第二个的学号,它直接跳过呢?

回复列表 (共2个回复)

沙发

对于这个问题,大概是这么个情况(查资料加上自己的领悟):
scanf()从输入流缓冲区中读取值的,而并非从键盘(也就是终端)缓冲区读取。而读取时遇到回车(\n)而结束的,这个\n会一起读入输入流缓冲区的,第一次接受输入时取走字符后会留下字符\n,第二次gets函数直接读到'\n',所以根本没有读到后面的内容,于是跳过了……

这里一段简短的示例代码:

#include <stdio.h>
int main(int argc, char *argv[])
{
    char a[20];
    scanf("%s",a);
    //printf("%s",a);     
    gets(a);
    printf("%s",a); 
    return 0;
}
//--------------------------------
#include <stdio.h>
int main(int argc, char *argv[])
{
    char a[20];    
    gets(a);
    printf("%s",a); 
    return 0;
}

板凳

因为输入完第一位同学的3门成绩之后,你输入了一个回车,那么 gets()读入了一个回车,此字符串是"\n",于是就悲剧了!~
把gets(b[i].n)改成scanf(" %s",b[i].n); 就可以了!~ 注意%s前面那个空格!~
另外不建议使用gets函数,因为这个函数是个危险函数。。。
用fgets,scanf代替吧!~

我来回复

您尚未登录,请登录后再回复。点此登录或注册