回 帖 发 新 帖 刷新版面

主题:关于结构中字符数组定义的问题

# include<stdio.h>
# define N 5
struct student
{
    char num[3];
    char name[6];
    float score[4];
}stu[N];
void main()
{
    void input(struct student stu[N]);
    void output(struct student stu[N] );
    input(stu);
    output(stu);
}


void input(struct student stu[N])
{
    int i,j;
    for(i=0;i<N;i++)
    {
        printf("please input the information of student %d:\n",i+1);
        printf("num:");
        scanf("%s",stu[i].num);
        printf("name:");
        scanf("%s",stu[i].name);
        for(j=0;j<4;j++)
        {
            printf("score%d:",j+1);
            scanf("%f",&stu[i].score[j]);
        }

    }
}



void output(struct student stu[N])
{
    int i,j;
    printf("num    name    score1    score2    score3    score4\n");
    for(i=0;i<N;i++)
    {
        printf("%-3s    %-6s",stu[i].num,stu[i].name);
        for(j=0;j<4;j++)
            printf("%-9.2f",stu[i].score[j]);
        printf("\n");
    }
    printf("\n");
}




显示结果时,为什么name显示两遍?我问同学,同学说在内存中,因为结构体中name占的内存比num大,所以会占num的内存,所以程序运行时,name显示两次,分别在num和name中。如果把char num[3];char name[6];的定义交换后,程序运行结果就正确了,这是为什么?

回复列表 (共1个回复)

沙发

%s格式输出的时候,会一直持续读内存直到读到\0(也就是NUL)
以你的程序来说,如果你的num输入了3个字符(比如"123"),那么num就会是'1','2','3',NUL
而又输入name的话(比如"test"),那么,注意,num最后一个NUL字符会被盖掉!
此时从num开始的内存为'1','2','3','t','e','s','t',NUL
当你%s输出num的时候,内存会持续输出直到读到NUL,而输出name的时候会把test再输出一遍。
总而言之,问题就出在你字符串数组里存放了过多的内容。一定要记住,char[]的最大合理容量是声明数量-1,最大合理读写下标是声明数量-2

我来回复

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