使用指针搜索特定字符串

时间:2016-01-03 19:16:32

标签: c arrays pointers

在一个假设的银行数据库中,我制作了一个50x7字符串指针数组(50个用户,每个用户7条信息[字符串])。

我必须要求用户输入用户名(第5列包含所有50个用户名),以便程序在该数组中找到它并删除与该用户相关的所有信息(用0替换该行的所有列)。

每当我输入用户名并按Enter键进行搜索和“擦除”时,它会立即崩溃。

我在编程方面是一个认真的菜鸟,所以尽量保持简单。 (没有自动功能)每个变量和指针都被正确启动。

下面是困扰我的具体部分。感谢您抽出宝贵的时间,我花了一整天时间试图了解这一点。

char* users[50][7];
char deluser[50], delaction[50]; //Delete Existing User
int flagfinder, delmenu, flagresearch=0; //Delete Existing User

while (delmenu == 0) {
    flagfinder = 0;
    printf("Type the username of the customer you want to erase off of the database:\n");
    scanf("%s", deluser);

    for (x = 0; x < 50; x++) {
        y = 1;
        while (flagresearch == 0 || y < 50) {
            if (deluser[y] != *(users[x][5] + y)) {
                flagresearch = 1;
            }
            y++;
        }
        if (flagresearch == 0) {
            printf("Are you sure you want to delete %s's info?(Yes/No)\n", deluser);
            scanf("%s", delaction);
            while (strcmp(delaction, "Yes") != 0 && strcmp(delaction, "No") != 0) {
                printf("Try again.Are you sure you want to delete %s's info?(Yes/No)\n", deluser);
            }
            if (strcmp(delaction, "Yes") == 0) {
                for (y = 0; y < 7; y++) {
                    *users[x][y] = 0;
                }
                printf("\n%s's data has been erased from the mainframe.\n\n");
                flagfinder = 1;
                delmenu = 1;
            } else
            if (strcmp(delaction, "No") == 0) {
            }
        }
    }
    if (flagfinder == 0) {
        printf("There is no %s in the database.\n", deluser);
    }
}

1 个答案:

答案 0 :(得分:1)

重新格式化代码后,很明显您没有使用正确的警告级别进行编译。编译器会发现这个错误:

if (flagfinder = 0) {

这条线也不太可能符合你的期望:

while (flagresearch == 0, y < 50) 

比较用户名的代码看起来不对:

    while (flagresearch == 0 || y < 50) {
        if (deluser[y] != *(users[x][5] + y)) {
            flagresearch = 1;
        }
        y++;
    }

这将始终比较50个字节,包括fscanf未初始化的字节。只有当users[x][5]指向的字符串恰好是49个字节和一个NUL字节时,它才能工作。我怀疑你正在读取数组的末尾,或者可能解除引用NULL指针。您确定所有数据库字符串都已分配吗?

您可以改用:

    flagresearch = (users[x][5] == NULL) || strcmp(users[x][5], deluser);

请注意,除非多个用户具有相同的名称,否则使用单个肯定标记(如flagfound)会更直观,并在找到匹配项时从for循环中断。