在一个假设的银行数据库中,我制作了一个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);
}
}
答案 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
循环中断。