为什么sex那一栏会多出现一个四?

img


为什么sex会多出现一个四?

#include"contant.h"

int main()
{
    struct Contact con;
    Init(&con);
    printf("\t\t\tSuccessfully Initialized!!\t\t\n");
    int sel;
    do
    {

        menu();

        scanf("%d", &sel);
        switch (sel)
        {
        case 1:
            Add(&con);
            break;
        case 2:
            //Del();
            break;
        case 3:
            break;
        case 4:
            break;
        case 5:
            Show(&con);
            break;
        case 0:
            exit(0);
        default:
            
            printf("Wrong input Please try again!\n");
            break;

        }


    } while (sel);
    return 0;
}

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#define Max_Name 200
#define Max_Tel 20
#define NumberOfMem 10

void menu();
void Init();
void Add();
void Show();
void menu()
{
    printf("\t\t\t***************************************\t\t\n");
    printf("\t\t\t**************1.Add     2.Del**********\t\t\n");
    printf("\t\t\t***************************************\t\t\n");
    printf("\t\t\t***************3.Search   4Modify******\t\t\n");
    printf("\t\t\t***************************************\t\t\n");
    printf("\t\t\t***************5.Show      0.Exit******\t\t\n");
}
struct PeoIfor
{
    char name[Max_Name];
    char tel[Max_Tel];
    char sex[2];
};

struct Contact
{
    struct PeoIfor data[NumberOfMem];
    int size;
};
void Init(struct Contact* ps)
{
    memset(ps->data, 0, sizeof(ps->data));
    ps->size = 0;
}
void Add(struct Contact* ps)
{

    if (ps->size == NumberOfMem)
    {
        printf("The contact is full,you can't add the contact\n");
    }
    else
    {
        printf("Please type the contact's name:\n");
        scanf("%s", ps->data[ps->size].name);
        printf("Please tpye the contact's telephone number\n");
        scanf("%s", ps->data[ps->size].tel);
        printf("What's the sex of the contact you just added?\n");
        scanf("%s", ps->data[ps->size].sex);
        ps->size++;
        printf("**************Sucessfully Added!*****************\n");
        printf("There's %d people in your contactn\n", ps->size);

    }
}
            
void Show(const struct Contact *ps)
{
    printf("%5s\t%3s\t%12s\n", "|Name|", "|Sex|", "|Tele|");
    if (ps->size == 0)
    {
        printf("The contact is void!\n");
    }
    else
    {
        for (int i = 0; i < ps->size; i++)
        {
            printf("%5s\t%3s\t     %12s\n",
                ps->data[i].name,
                ps->data[i].sex,
                ps->data[i].tel);
        }
    }
}

char sex[2];
这个定义太小了,一个中文占2字节,加上结束符,起码要定义成
char sex[3];
否则就出现你那个情况,
另外这也是网络安全所说堆栈溢出的原因所在

因为你第一次输入张三(空格或换行)电话(空格或换行)男,后没有空格或换行,然后继续输入李四(空格或换行)电话(空格或换行)女。所以李四与前面的人性别男之间无换行或空格,就会被当成前面的人性别“男”这一个输入还没有输完。
所以你可以在每次输入性别后加一个空格或换行,这样告诉计算机你性别已输完。