c - 为什么我的代码无法工作?

标签 c

我的代码有一些问题。我的问题是在“查看列表联系人”中,我需要进行字符串排序,当我输入不带空格的名称时它可以工作,但是当我输入带空格的名称时,我的程序显示错误的输出。

#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[100];
    int flag, flag_1, flag_2, flag_3;
    int i;
    int n = 0;

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[n].name);

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

            }

            if (strlen(contact[n].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[n].number);

            for (i = 0; i < strlen(contact[n].number); i++) {
                if (!isdigit(contact[n].number[i])) {
                    flag_2 = 0;
                }
            }
            if (flag_2 == 0) {
                printf("Phone numbers should only contain digits (0-9)\n");
            }
            if (strlen(contact[n].number) < 6 || strlen(contact[n].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("Press Enter to continue...");
            n++;
            getchar();
            getchar();
            system("cls");
            goto start;

    case 2:

        char temp[30];
        int i, j, check;
        printf("View List Contact\n\n");
        printf("    # Name                         Phone Number\n");

        for (i = 0; i < n; i++) {
            for (j = 0; j < n; j++) {
                check = strcmp(contact[i].name, contact[j].name);
                if (check < 0) {
                    strcpy(temp, contact[i].name);
                    strcpy(contact[i].name, contact[j].name);
                    strcpy(contact[j].name, temp);

                    strcpy(temp, contact[i].number);
                    strcpy(contact[i].number, contact[j].number);
                    strcpy(contact[j].number, temp);
                }
            }
        }


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



        getchar();
    }

    getchar();
    return 0;
}

最佳答案

我没看出有什么问题。当我运行代码时,它给了我错误,所以我移动了一些变量,它的运行方式就像名称中带有空格一样。

这是我移动后的代码:

char temp[30];
int j, check;

在全局变量中。

#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[100];
    int flag, flag_1, flag_2, flag_3;
    int i;
    int n = 0;
    char temp[30];
    int j, check;

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[n].name);

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

            }

            if (strlen(contact[n].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[n].number);

            for (i = 0; i < strlen(contact[n].number); i++) {
                if (!isdigit(contact[n].number[i])) {
                    flag_2 = 0;
                }
            }
            if (flag_2 == 0) {
                printf("Phone numbers should only contain digits (0-9)\n");
            }
            if (strlen(contact[n].number) < 6 || strlen(contact[n].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("Press Enter to continue...");
            n++;
            getchar();
            getchar();
            system("cls");
            goto start;

    case 2:


        printf("View List Contact\n\n");
        printf("    # Name                         Phone Number\n");

        for (i = 0; i < n; i++) {
            for (j = 0; j < n; j++) {
                check = strcmp(contact[i].name, contact[j].name);
                if (check < 0) {
                    strcpy(temp, contact[i].name);
                    strcpy(contact[i].name, contact[j].name);
                    strcpy(contact[j].name, temp);

                    strcpy(temp, contact[i].number);
                    strcpy(contact[i].number, contact[j].number);
                    strcpy(contact[j].number, temp);
                }
            }
        }


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



        getchar();
    }

    getchar();
    return 0;
}

关于c - 为什么我的代码无法工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34495215/

相关文章:

c - 使用 RSA 算法加密-字母 'w' ,'x' ,'y' ,'z'

c - 使用 dirent.h 浏览文件?

c - GTK+ 2 C - 按下输入或单击按钮以从条目小部件获取文本

c - 如何在 C 中将 float 转换为字符串而不丢失用户输入的精度?

C - 错误的斐波那契数

隐藏赋值的 C 宏技巧?

c++ - 变量的 block 结构内存分配

c++ - 根据 Cmake 中的条件包含目录

c - 为什么 getline 在将 `-wrap=malloc` 传递给链接器时调用 glibc 的 malloc 而不是 __wrap_malloc?

c - 如何创建一个仅使用指针转置矩阵的就地方法?