一个希奇的问题:百思不得其解

时间:2008-05-13 15:34:01   来源:论坛整理  作者:  编辑:chinaitzhe
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/



#include<stdio.h>

#include<stdlib.h>

#define STU_NUM 2

#define CLASS_NUM 3

void main(void)

{

    FILE *fp;

    int i = 0, j = 0;

    char *title = "学号\t姓名\t成绩A\t成绩B\t成绩C\t平均成绩";

    char stunum[STU_NUM][2] = {NULL}, stuname[STU_NUM][10] = {NULL};

    float grade[STU_NUM][CLASS_NUM] = {0}, sum = 0, aver = 0;

    if((fp = fopen("stud.txt","w")) == NULL)

    {

        printf("can't create file!\n");

        exit(0);

    }

    fprintf(fp, title);

    fprintf(fp, "\n");

    for(i = 0; i < STU_NUM; i  )

    {

        sum = 0;

        printf("请输入学生%d学号,姓名,3个成绩:\n", i   1);

        gets(stunum[i]);                     //为什么第二次循环就不运行了?

        fprintf(fp, stunum[i]);

        fprintf(fp, "\t");

        gets(stuname[i]);

        fprintf(fp, stuname[i]);

        fprintf(fp, "\t");

        for(j = 0; j < CLASS_NUM; j   )

        {

            scanf("%f", &grade[i][j]);

            fprintf(fp, "%4.1f\t", grade[i][j]);

            sum  = grade[i][j];

        }

        aver = sum / CLASS_NUM;

        fprintf(fp, "%4.1f\n", aver);

    }

}


结果如下:
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/



学号    姓名    成绩A    成绩B    成绩C    平均成绩

8    8     8.0     8.0     8.0     8.0

    a     4.0     4.0     4.0     4.0




网友回复:stunum一共才4个字节,你第1次输入了几个字符?你gets(stunum[i]);溢出之后发生什么都是正常的。
网友回复:
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#define STU_NUM 2
#define CLASS_NUM 3
void main(void)
{
FILE *fp;
int i = 0, j = 0;
char *title = "学号\t姓名\t成绩A\t成绩B\t成绩C\t平均成绩";
char stunum[STU_NUM][2] = {NULL}, stuname[STU_NUM][10] = {NULL};
float grade[STU_NUM][CLASS_NUM] = {0}, sum = 0, aver = 0;
if((fp = fopen("stud.txt","w")) == NULL)
{
printf("can't create file!\n");
exit(0);
}
fprintf(fp, title);
fprintf(fp, "\n");
for(i = 0; i < STU_NUM; i )
{
sum = 0;
printf("请输入学生%d学号,姓名,3个成绩:\n", i 1);
fflush(stdin);
gets(stunum[i]); //为什么第二次循环就不运行了?
fprintf(fp, stunum[i]);
fprintf(fp, "\t");
gets(stuname[i]);
fprintf(fp, stuname[i]);
fprintf(fp, "\t");
for(j = 0; j < CLASS_NUM; j )
{
scanf("%f", &grade[i][j]);
fprintf(fp, "%4.1f\t", grade[i][j]);
sum = grade[i][j];
}
aver = sum / CLASS_NUM;
fprintf(fp, "%4.1f\n", aver);
}
}
网友回复:
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/



#include<stdio.h>

#include<stdlib.h>

#define STU_NUM 2

#define CLASS_NUM 3

int main(void)

{

    FILE *fp;

    int i = 0, j = 0;

    char *title = "学号\t姓名\t成绩A\t成绩B\t成绩C\t平均成绩";

    char stunum[STU_NUM][10] = {NULL}, stuname[STU_NUM][10] = {NULL};//stunum空间太小

    float grade[STU_NUM][CLASS_NUM] = {0}, sum = 0, aver = 0;

    if((fp = fopen("stud.txt","w")) == NULL)

    {

        printf("can't create file!\n");

        exit(0);

    }

    fprintf(fp, title);

    fprintf(fp, "\n");

    for(i = 0; i < STU_NUM; i  )

    {

        sum = 0;

        printf("请输入学生%d学号,姓名,3个成绩:\n", i   1);

        gets(stunum[i]);                     //为什么第二次循环就不运行了?

       

    fprintf(fp, stunum[i]);

        fprintf(fp, "\t");

        gets(stuname[i]);

               

    fprintf(fp, stuname[i]);

        fprintf(fp, "\t");

        for(j = 0; j < CLASS_NUM; j   )

        {

            scanf("%f", &grade[i][j]);

            printf("%f ",grade[i][j]);

            fprintf(fp, "%4.1f\t", grade[i][j]);

            sum  = grade[i][j];

        }

        scanf("%*c"); //上次输入的读入回车

        

        aver = sum / CLASS_NUM;

        fprintf(fp, "%4.1f\n", aver);

    }

    fclose(fp);

    return 0;

}




网友回复:谢谢了,不过中间隔了一句printf("请输入学生%d学号,姓名,3个成绩:\n", i 1);
为什么还得回收回车符
网友回复:
引用 4 楼 wxhsun 的回复:
谢谢了,不过中间隔了一句printf("请输入学生%d学号,姓名,3个成绩:\n", i 1);
为什么还得回收回车符

回收回车是因为这条语句:scanf("%f", &grade[i][j]);
在scanf输入时都是以行进行缓冲的,printf只是输入出语句,对缓冲区不影响
在scanf()时每次读入整数或其它非字符时是对回车等空字符忽略的,假如紧接着读入的是字符、或字符串时,输入中的回车也将视为一个字符被读入...
关键字:一个,希奇,问题,百思不得其解,

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面