c - 如何在c编程中显示输入并进行排序

标签 c

我在显示程序输入时遇到问题。有人可以帮我解决我的问题吗?

我希望我的程序看起来像这样。但是当我输入多个名字和号码时我的程序只显示一个名字,这很令人困惑 enter image description here

#pragma warning (disable:4996)
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>

struct contact {
    char name[30];
    char number[12];    
};

int main() {
    int menu;
    struct contact contact;
    int flag, flag_1, flag_2, flag_3;
    int i;

    start:
    printf("Phone Book\n");
    printf("==========\n");
    printf("1. Add New Contact\n");
    printf("2. View List Contact\n");
    printf("3. Search Contact\n");
    printf("4. Delete Contact\n");
    printf("5. Exit\n");
    printf("choose menu: ");
    scanf("%d", &menu); fflush(stdin);
    system("cls");

    switch (menu) {
    case 1: printf("Add New Contact\n\n");
        do {
            flag = flag_1 = 1;
            printf("input name [1..30 char]: ");
            scanf(" %[^\n]", contact.name);

            if (!isalpha(contact.name[0])) {
                flag = 0;
                printf("First letter of name should be an alphabet (A-Z or a-z)\n");    
            }

            if (strlen(contact.name) > 30) {
                flag_1 = 0;
                printf("Length of name should be between 1 and 30 characters\n");
            }           
        } while (flag == 0 || flag_1 == 0);

        do {
            flag_2 = flag_3 = 1;
            printf("Input phone number[6..12 digits]: ");
            scanf(" %[^\n]", contact.number);

            for (i = 0; i < strlen(contact.number); i++) {
                if (!isdigit(contact.number[i])) {
                    flag_2 = 0;
                }
            }
            if (flag_2 == 0) {
                printf("Phone numbers should only contain digits (0-9)\n");
            }
            if (strlen(contact.number) < 6 || strlen(contact.number) > 12) {
                flag_3 = 0;
                printf("Length of phone numbers should be between 6 and 12 digits\n");
            }        
        } while (flag_2 == 0 || flag_3 == 0);

        printf("\n");
        printf("New contact successfully added!\n\n");
        printf("Name   : %s \nNumber : %s\n\n", contact.name, contact.number);
        printf("Press Enter to continue...");

        getchar();
        getchar();
        system("cls");
        goto start;

    case 2:
        char c;
        int i;
        printf("View List Contact\n\n");
        printf("    # Name                         Phone Number\n");

        for (c = 'A'; c <= 'Z'; c++) {
            for (i = 1; ; i++) {
                if (c == contact.name[0]) {
                    printf("%c   %d. %s              %s", c, i, contact.name, contact.number);
                }
                break;
            }
        }
        getchar();           
    }
    getchar();
    return 0;
}

最佳答案

目前,您仅使用 namenumber 元素(均为 char 数组)创建一个 contact 变量。这就是为什么您只能记录一个联系人。

为了做到这一点,首先,您需要创建一个 contact 数组并使用一个变量来跟踪您当前拥有的联系人数量:

struct contact {
    char name[30];
    char number[12];
};

int main() {
    int menu;
    struct contact contacts[30]; //add this
    int flag, flag_1, flag_2, flag_3;
    int i;
    char c;
    int noOfContact = 0; //add this

然后,对于情况 1,您应该指向要根据 noOfContact 给出的索引创建的 contacts 数组中的 contact像这样

case 1: printf("Add New Contact\n\n");
    do {
        flag = flag_1 = 1;
        printf("input name [1..30 char]: ");
        scanf(" %[^\n]", contacts[noOfContact].name); //notice the noOfContact index is used

        if (!isalpha(contacts[noOfContact].name[0])) {
            flag = 0;
            printf("First letter of name should be an alphabet (A-Z or a-z)\n");
        }

        if (strlen(contacts[noOfContact].name) > 30) {
            flag_1 = 0;
            printf("Length of name should be between 1 and 30 characters\n");
        }
    } while (flag == 0 || flag_1 == 0);

    do {
        flag_2 = flag_3 = 1;
        printf("Input phone number[6..12 digits]: ");
        scanf(" %[^\n]", contacts[noOfContact].number);

        for (i = 0; i < strlen(contacts[noOfContact].number); i++) {
            if (!isdigit(contacts[noOfContact].number[i])) {
                flag_2 = 0;
            }
        }
        if (flag_2 == 0) {
            printf("Phone numbers should only contain digits (0-9)\n");
        }
        if (strlen(contacts[noOfContact].number) < 6 || strlen(contacts[noOfContact].number) > 12) {
            flag_3 = 0;
            printf("Length of phone numbers should be between 6 and 12 digits\n");
        }
    } while (flag_2 == 0 || flag_3 == 0);

    printf("\n");
    printf("New contact successfully added!\n\n");
    printf("Name   : %s \nNumber : %s\n\n", contacts[noOfContact].name, contacts[noOfContact].number);
    printf("Press Enter to continue...");
    noOfContact++;

    getchar();
    getchar();
    system("cls");
    goto start;

类似地,在情况 2 中,您应该创建从 0 到 noOfContact 的迭代,以一一显示您的 contact,如下所示。

case 2:
    printf("View List Contact\n\n");
    printf("    # Name                         Phone Number\n");
    for (i = 0; i < noOfContact; ++i)
        printf("%c   %d. %s              %s\n", c, i, contacts[i].name, contacts[i].number);
    getchar();
}

键是 contact 数组和 noOfContact

关于c - 如何在c编程中显示输入并进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34326660/

相关文章:

c - 为什么需要显式 `-lm` 编译器选项?

python - 重写实时 TCP/IP(第 4 层)(即套接字层)流

C 程序 - 输出显示在下一行而不使用换行符

c - 在gdb 下调试汇编代码|平台linux

c - 无法加载共享库 : undefined symbols

数组的 C 编程

c - Bison 语法错误 意外 $undefined 期待 $end 错误

c - 需要从 C 文件列表中删除目录

c - 为什么 fmax(a, b) 返回较小的(负)零以及如何干净地解决它?

c - 将本地堆栈变量放入全局列表中,以便其他线程可以使用它