c-使用指针搜索特定字符串



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

我必须要求用户输入用户名(第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.nn");
                flagfinder = 1;
                delmenu = 1;
            } else
            if (strcmp(delaction, "No") == 0) {
            }
        }
    }
    if (flagfinder == 0) {
        printf("There is no %s in the database.n", deluser);
    }
}

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

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循环中断会更直观。

最新更新