关于编写简易通讯录程序时遇到的空格输入问题

如图,在运行Add_a_contact函数时想在name里输入带空格的字符串,name会和number跳到同一行去,且无法输入name,无论是用gets还是%[^\n]都是同样的输出结果。初学者求解,谢谢!

#include 
#include 
#include 





struct Information
{
    char name[255];
    char number[255];
    char email[255];
    char department[255];
}Information;

struct Contact_list
{
    int sizeofContact;
    struct Information context[500];
};

void Print_contact_list (const struct Contact_list *a) {
    int i = 0;
    for (i = 0; i < a->sizeofContact; i++)
    {
        printf("%s\t%s\t%s %s\n",a->context[i].number,a->context[i].email,a->context[i].name,a->context[i].department);
    }

}

void Add_a_contact (struct Contact_list *a)
{
    printf("Name:");
    scanf("%[^\n]",a->context[a->sizeofContact].name);
    printf("Number:");
    scanf("%s",a->context[a->sizeofContact].number);
    printf("Email:");
    scanf("%s",a->context[a->sizeofContact].email);
    printf("Department:");
    scanf("%s",a->context[a->sizeofContact].department);
    a->sizeofContact++;
}




void menu()
{
    printf("1) Print contact list\n");
    printf("2) Add a contact\n");
    printf("3) Modify a contact\n");
    printf("4) Delete a contact\n");
    printf("5) Search\n");
    printf("6) Quit\n");
};


int main()
{
    int x = 0;
    struct Contact_list C;
    do {
        menu();
        printf("Option:");
        scanf("%d",&x);
        switch(x)
        {
            case 1:
                Print_contact_list(&C);
                break;
            case 2:
                Add_a_contact(&C);
                break;
            case 6:
                break;
        }
    } while (x);
    return 0;
}

img

因为缓存问题导致,用getchar()读取掉缓存中的字符。
输入的字符串中包含空格,要用gets()方法。
修改如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Information
{
    char name[255];
    char number[255];
    char email[255];
    char department[255];
}Information;
struct Contact_list
{
    int sizeofContact;
    struct Information context[500];
};
void Print_contact_list (const struct Contact_list *a) {
    int i = 0;
    for (i = 0; i < a->sizeofContact; i++)
    {
        printf("%s\t%s\t%s %s\n",a->context[i].number,a->context[i].email,a->context[i].name,a->context[i].department);
    }
}
void Add_a_contact (struct Contact_list *a)
{
    getchar(); 
    printf("Name:");
    gets(a->context[a->sizeofContact].name);
    printf("Number:");
    scanf("%s",a->context[a->sizeofContact].number);
    printf("Email:");
    scanf("%s",a->context[a->sizeofContact].email);
    printf("Department:");
    scanf("%s",a->context[a->sizeofContact].department);
    a->sizeofContact++;
}
 
 
void menu()
{
    printf("1) Print contact list\n");
    printf("2) Add a contact\n");
    printf("3) Modify a contact\n");
    printf("4) Delete a contact\n");
    printf("5) Search\n");
    printf("6) Quit\n");
};
 
int main()
{
    int x = 0;
    struct Contact_list C;
    do {
        menu();
        printf("Option:");
        scanf("%d",&x);
        switch(x)
        {
            case 1:
                Print_contact_list(&C);
                break;
            case 2:
                Add_a_contact(&C);
                break;
            case 6:
                return 0;
        }
    } while (x);
    return 0;
}

scanf("%d",&x); 后有换行符,你需要加getchar()接收掉换行符才行

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Information
{
    char name[255];
    char number[255];
    char email[255];
    char department[255];
}Information;
struct Contact_list
{
    int sizeofContact;
    struct Information context[500];
};
void Print_contact_list (const struct Contact_list *a) {
    int i = 0;
    for (i = 0; i < a->sizeofContact; i++)
    {
        printf("%s\t%s\t%s %s\n",a->context[i].number,a->context[i].email,a->context[i].name,a->context[i].department);
    }
}
void Add_a_contact (struct Contact_list *a)
{
    printf("Name:");
    scanf("%[^\n]",a->context[a->sizeofContact].name);
    printf("Number:");
    scanf("%s",a->context[a->sizeofContact].number);
    printf("Email:");
    scanf("%s",a->context[a->sizeofContact].email);
    printf("Department:");
    scanf("%s",a->context[a->sizeofContact].department);
    a->sizeofContact++;
}
void menu()
{
    printf("1) Print contact list\n");
    printf("2) Add a contact\n");
    printf("3) Modify a contact\n");
    printf("4) Delete a contact\n");
    printf("5) Search\n");
    printf("6) Quit\n");
};
int main()
{
    int x = 0;
    struct Contact_list C;
    do {
        menu();
        printf("Option:");
        scanf("%d",&x);
        getchar();
        switch(x)
        {
            case 1:
                Print_contact_list(&C);
                break;
            case 2:
                Add_a_contact(&C);
                break;
            case 6:
                break;
        }
    } while (x);
    return 0;
}


您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632