Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c语言编程实现电话簿的输入输出和排序_C - Fatal编程技术网

c语言编程实现电话簿的输入输出和排序

c语言编程实现电话簿的输入输出和排序,c,C,我想做一本电话簿 我的第一个问题是,当我第二次输入电话号码时,第一个电话号码会受到第二个姓名的影响,如下所示: 排序字符串还有一个额外的问题。这是我的密码: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> struct contact { char name[29]; char number[11]; }; int ma

我想做一本电话簿

我的第一个问题是,当我第二次输入电话号码时,第一个电话号码会受到第二个姓名的影响,如下所示:

排序字符串还有一个额外的问题。这是我的密码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

struct contact {
    char name[29];
    char number[11];
};

int main() {
    struct contact contact[100];
    int menu;
    int n = 0;
    int i, j, flag_1, flag_2, flag_3, flag_4, loop;
    char temp[29];

    do {
        loop = 0;
        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); 
        system("cls");

        switch (menu) {
        case 1:

            printf("Add New Contact\n");
            do {
                flag_1 = flag_2 = 1;
                printf("Input name [1..30 char]: ");
                scanf(" %[^\n]", contact[n].name); 

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

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

            } while (flag_1 == 0 || flag_2 == 0);

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

                if (strlen(contact[n].number) < 6 || strlen(contact[n].number) > 12) {
                    printf("Length of phone numbers should be between 6 and 12 digits.\n");
                    flag_3 = 0;
                }

                for (i = 0; i < strlen(contact[n].number); i++) {
                    if (!isdigit(contact[n].number[i])) {
                        flag_4 = 0;
                    }
                }
                if (flag_4 == 0) {
                    printf("Phone numbers should only contain digits (0-9).\n");
                }
            } while (flag_3 == 0 || flag_4 == 0);

            printf("\n");
            printf("New contact successfully added!\n\n");
            printf("Name : %s\n", contact[n].name);
            printf("Number : %s\n\n", contact[n].number);
            printf("Press Enter to continue...");
            n++;
            getchar();
            getchar();
            system("cls");
            loop = 0;
            break;


        case 2:
            printf("View List Contact\n\n");
            for (i = 0; i < n; i++) {
                for (j = 0; j < n - 1; j++) {
                    if (strcmp(contact[j].name, contact[j + 1].name) > 0) {
                        strcpy(temp, contact[j].name);
                        strcpy(contact[j].name, contact[j + 1].name);
                        strcpy(contact[j + 1].name, temp);

                        strcpy(temp, contact[j].number);
                        strcpy(contact[j].number, contact[j + 1].number);
                        strcpy(contact[j + 1].number, temp);

                    }
                }
            }
            printf("     # Name                            Phone Number\n");
            for (i = 0; i < n; i++) {
                printf("    %d %s                 %s\n", i + 1, contact[i].name, contact[i].number);
            }

            getchar();
            getchar();
            system("cls");
            loop = 0;
            break;
        }

    } while (loop == 0);
    getchar();
    return 0;
}
#包括
#包括
#包括
#包括
结构接触{
字符名[29];
字符数[11];
};
int main(){
结构触点[100];
int菜单;
int n=0;
int i,j,flag_1,flag_2,flag_3,flag_4,loop;
煤焦温度[29];
做{
循环=0;
printf(“电话簿”);
printf(“================\n”);
printf(“1.添加新联系人\n”);
printf(“2.查看列表联系人\n”);
printf(“3.搜索联系人”);
printf(“4.删除联系人\n”);
printf(“5.退出\n”);
printf(“选择菜单:”);
scanf(“%d”,菜单(&M);
系统(“cls”);
开关(菜单){
案例1:
printf(“添加新联系人”);
做{
标志_1=标志_2=1;
printf(“输入名称[1..30字符]:”;
scanf(“%[^\n]”,联系人[n]。姓名);
如果(strlen(联系人[n].name)>30){
printf(“名称长度应介于1到30个字符之间。\n”);
标志_1=0;
}
如果(!isalpha(联系人[n].name[0])){
printf(“名字的第一个字母应该是字母表(A-Z od A-Z)。\n”);
标志_1=0;
}
}while(flag_1==0 | | flag_2==0);
做{
标志3=标志4=1;
printf(“输入电话号码[6..12位]:”;
scanf(“%s”,联系人[n]。号码);
如果(strlen(联系人[n].number)<6 | | strlen(联系人[n].number)>12){
printf(“电话号码的长度应在6到12位之间。\n”);
标志_3=0;
}
对于(i=0;i0){
strcpy(临时,联系人[j].姓名);
strcpy(联系人[j]。姓名,联系人[j+1]。姓名);
strcpy(联系人[j+1]。姓名、温度);
strcpy(温度,触点[j]。编号);
strcpy(联系人[j]。编号,联系人[j+1]。编号);
strcpy(联系人[j+1]。编号、温度);
}
}
}
printf(“姓名电话号码”);
对于(i=0;i
有人能帮我解决问题吗


注:为我的英语不好表示歉意。

如评论中所示,问题是您的阅读溢出,您阅读的内容超出了为
字符编号[11]
保留的空间,因此,请一直阅读到下一个“\0”,在本例中,
字符名称[29]
中的内容

在内存中,结构的形式如下:

-----------------------
| name[0]    |
|  ...       |  
| name[29]   |   this is the X element of contact[100]
| number[0]  |
|  ...       |
| number[11] |
-----------------------
| name[0]    |
|  ...       |  
| name[29]   |    this is the X+1 element of contact[100]
| number[0]  |   
|  ...       |
| number[11] |
-----------------------
要解决此问题,您应该将
字符编号[11]
的大小增加到
字符编号[12]
,并(始终)自己将“\0”分配到最后一个位置

编号[11]='\0'

您应该对
名称执行相同的操作。这是一个很好的做法,将最大长度指定为
scanf

scanf("%3s", string); -- only reads 3 caracter from the input.

编辑:添加了有关如何修复的信息。

如注释中所示,问题是您的读取溢出,您读取的内容超出了为
字符编号[11]
保留的空间,因此一直读取到下一个'\0',在这种情况下,
字符名称[29]
中存在的内容

在内存中,结构的形式如下:

-----------------------
| name[0]    |
|  ...       |  
| name[29]   |   this is the X element of contact[100]
| number[0]  |
|  ...       |
| number[11] |
-----------------------
| name[0]    |
|  ...       |  
| name[29]   |    this is the X+1 element of contact[100]
| number[0]  |   
|  ...       |
| number[11] |
-----------------------
要解决此问题,您应该将
字符编号[11]
的大小增加到
字符编号[12]
,并(始终)自己将“\0”分配到最后一个位置

编号[11]='\0'

您应该对
名称执行相同的操作。这是一个很好的做法,将最大长度指定为
scanf

scanf("%3s", string); -- only reads 3 caracter from the input.

编辑:添加了如何修复的信息。

关于代码的几点注释:

1.制作代码流程图,简要说明代码结构。这将通过跳过可能的代码重复、将多次使用的代码转换为函数或删除冗余行来帮助您降低代码复杂性和代码量

2.如果将代码分解为执行简单任务的小函数,则管理代码和检测可能的错误会容易得多。例如,可以将开头的所有打印消息放入单个函数中,如下所示:

void promt_message (void) {

    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); 
    system("cls");

}  
然后将
main()
中的所有这些行替换为