关于#c语言#的问题:#include <stdio.h>

为什么再次输入数据后,输出时会多一个空数据。

img

img

img

#include
#include
void tj();
void yl();
void menu();
struct number
{
    char no[20];
    char name[20];
    char address[20];
    char phone[20];
}s[100];
int main()
{
    int i;
    menu();    
    scanf("%d",&i);
    getchar();
    switch(i)
    {
        case 1:tj();break;
        case 2:yl();break;
    }
}
void tj()
{
    int i=0,m;
    FILE *fp;
    char ch;
    fp=fopen("C:/Users/陈/Desktop/student.dat.txt","r");
    ch=fgetc(fp);
    if(ch==NULL)
    {
        printf("打开失败");
    }
    else
    {
        fclose(fp);
        printf("输入Y继续输入,输入N退出\n");
        scanf("%c",&ch);
        getchar();
        while(ch=='Y')
        {
            printf("学号");
            gets(s[i].no);
            printf("姓名");
            gets(s[i].name);
            printf("地址");
            gets(s[i].address);
            printf("电话号码");
            gets(s[i].phone);
            i++;
            printf("输入Y继续输入,输入N退出\n");
            scanf("%c",&ch);
            getchar();
        }
        fp=fopen("C:/Users/陈/Desktop/student.dat.txt","a");
        ch=fgetc(fp);
        if(ch==NULL)
        {
            printf("打开失败");
        }
        else
        {
            for(m=0;m<=i;m++)
            {
                fwrite(&s[m],sizeof(s),1,fp);
            }
            fclose(fp);
        }
    } 
}
void yl()
{
    FILE *fp;
    char ch;
    int i=0,m;
    fp=fopen("C:/Users/陈/Desktop/student.dat.txt","r");
    ch=fgetc(fp);
    if(ch==NULL)
    {
        printf("未找到学生信息"); 
    }
    else
    {
        fseek(fp,0,SEEK_SET);
        while(!feof(fp))
        {
            ch=fgetc(fp);
            if(feof(fp))
            {
                break;
            }
            fseek(fp,-1,1);
            fread(&s[i],sizeof(s),1,fp);
            i++;
        }
        fclose(fp);
        for(m=0;m-1;m++)
        {
            printf("学号%s\n",s[m].no);
            printf("姓名%s\n",s[m].name);
            printf("地址%s\n",s[m].address);
            printf("电话号码%s\n",s[m].phone);
        }
    }
}
void menu()
{
    printf("1.添加学生信息\n");
    printf("2.浏览学生信息\n");
}

问题可能出现在文件操作部分,因为你在写入学生信息到文件时,使用的是循环 for(m=0;m<=i;m++),这里应该改为 for(m=0;m<i;m++),因为 i 表示输入的学生信息数量,所以最后一个元素的下标应该是 i-1,而不是 i。这样就可以避免输出多余的空数据了。
望采纳

你是说最后的空行吗?

 for(m=0;m<i-1;m++)
        {
            printf("学号%s\n",s[m].no);
            printf("姓名%s\n",s[m].name);
            printf("地址%s\n",s[m].address);
            printf("电话号码%s",s[m].phone);
            if(m!=i-2)
              printf("\n");
        }

在添加学生信息时,程序在最后一个学生信息输入完后,会将最后一个输入的回车符(即按下Enter键的字符)也读入了程序,导致输出时会多一行空行。可以在读取输入Y/N的字符后,再加上一句getchar()语句,将多余的回车符读入,以避免这个问题。例如:

printf("输入Y继续输入,输入N退出\n");
scanf("%c",&ch);
getchar(); // 读取多余的回车符
while(ch=='Y')
{
    // ...

在输出学生信息时,也可以在每次输出后再加上一个换行符,即在printf语句的末尾加上\n,这样输出每个学生信息时,每个信息之间就会有一个空行,使输出更清晰。例如:

for(m=0;m<i-1;m++)
{
    printf("学号%s\n",s[m].no);
    printf("姓名%s\n",s[m].name);
    printf("地址%s\n",s[m].address);
    printf("电话号码%s\n",s[m].phone);
    printf("\n"); // 输出一个空行
}