为什么执行完后,最后一个结构体的name也就是z怎么不见了

代码如下,当我输入
“z
15227036227
a
15227036227
b
13230602579
c
13230602579
d
134632026889”时运行接过如下,执行到最后z为什么不见了?

img


#include
#include
#define N 5
typedef struct {
    char name[20];
    char num[12];
}USER;

void getdata(USER* sp);
void getsort(USER* sp);
void outdata(USER *sp);
int main()//主函数
{
    USER sp[N];
    getdata(sp); outdata(sp);getsort(sp); putchar('\n');outdata(sp);printf("\n\n%s", sp[4].name);
    return 0;
}
void getdata(USER* sp)//进行输入5个数据
{
    int i;
    for (i = 0; i < 5; i++)
        scanf("%s%s", sp[i].name, sp[i].num);
}
void getsort(USER* sp)
{
    int i, j;
    char temp[20];
    for (i=0;i<4;i++)
        for(j=0;j<4-i;j++)
            if (strcmp(sp[j].name, sp[j+1].name) > 0)//如果比后面一个名字大则替换两边数据
            {    printf("%s交换%s\t", sp[j].name, sp[j+1].name);//在屏幕输出交换的双方
                strcpy(temp, sp[j].name);
                strcpy(sp[j].name, sp[j+1].name);
                strcpy(sp[j+1].name, temp);
        
                strcpy(temp, sp[j].num);
                strcpy(sp[j].num, sp[j+1].num);
                strcpy(sp[j+1].num, temp);
                printf("%s已经和%s交换\t", sp[j+1].name, sp[j].name);//在屏幕输出已经交换成功了
            }
}
void outdata(USER *sp)//进行输出5个数据
{
    int i;
    for (i = 0; i < 5; i++)
    printf("\n%s:%s\n", sp[i].name, sp[i].num);
}

结构体里 char num[12]; 定义12位小了,输入最后的 d 134632026889 这里13位了,越界了,修改如下,供参考:

#include<stdio.h>
#include<string.h>
#define N 5
typedef struct {
    char name[20];
    char num [20]; //char num[12];  修改
}USER;

void getdata(USER* sp);
void getsort(USER* sp);
void outdata(USER* sp);
int main()//主函数
{
    USER sp[N];
    getdata(sp); 
    outdata(sp); 
    getsort(sp); 
    putchar('\n'); 
    outdata(sp); 
    printf("\n\n%s", sp[4].name);
    return 0;
}
void getdata(USER* sp)//进行输入5个数据
{
    int i;
    for (i = 0; i < 5; i++)
        scanf("%s %s", sp[i].name, sp[i].num);
}
void getsort(USER* sp)
{
    int i, j;
    char temp[20];
    for (i = 0; i < 4; i++)
        for (j = 0; j < 4 - i; j++)
            if (strcmp(sp[j].name, sp[j + 1].name) > 0)//如果比后面一个名字大则替换两边数据
            {
                printf("%s交换%s\t", sp[j].name, sp[j + 1].name);//在屏幕输出交换的双方
                strcpy(temp, sp[j].name);
                strcpy(sp[j].name, sp[j + 1].name);
                strcpy(sp[j + 1].name, temp);

                strcpy(temp, sp[j].num);
                strcpy(sp[j].num, sp[j + 1].num);
                strcpy(sp[j + 1].num, temp);
                printf("%s已经和%s交换\t", sp[j + 1].name, sp[j].name);//在屏幕输出已经交换成功了
            }
}
void outdata(USER* sp)//进行输出5个数据
{
    int i;
    for (i = 0; i < 5; i++)
        printf("\n%s:%s\n", sp[i].name, sp[i].num);
}