我正在努力提高自己的C语言技能,因此,如果我的问题很长,我深表歉意。我很难理解为什么结构指针在程序中保持错误的值,我尝试对其进行调试,但是我对C还是比较陌生,希望你们中的一个可以告诉我我在这里做错了什么以及如何改进代码以及重点关注的内容。
我正在制作一个程序,该程序在此结构上存储用户数据,然后将其打印出来。
typedef struct table {
char *firstName;
char *lastName;
int id;
}USER;
下面的函数存储名字
void firstName(int *counter, int *check, USER *pt) {
for (int i = *counter; i < *check; i++) {
pt[i].firstName = calloc (MAX_LENGTH, sizeof(pt));
printf("Enter First Name: ");
getchar();
fgets(pt[i].firstName, MAX_LENGTH, stdin);
}
}
这只是我的布尔函数返回true或false
bool isTrue(char *decision) {
if(*decision == 'Y') {
return true;
}
else {
return false;
}
}
这是我的主要
int main(int argc, char **argv) {
USER *pt = calloc(1, sizeof(pt));
int counter = 0, check = 0;
char decision = '\0';
while (1) {
printf("Would you like to enter a user?(Y/N):");
fgets(&decision, 2, stdin);
strtok(&decision, "\n"); //remove the newline char
if (!isTrue(&decision)) {
break;
}
if (counter != 0) {
pt = realloc(pt, sizeof(pt) * 10); //the 10 is temporary
}
check = counter + 1; // make sure loop only runs once.
firstName(&counter, &check, pt);
++counter; // increment counter;
}
printStruct(pt, &counter);
return 0;
}
当我用完它时,它有时可以正常工作并返回所有内容,有时它会跳过一个值。这就是我得到的。它跳过指针索引1处的值,而是打印垃圾。
Would you like to enter a user?(Y/N):N
First name at array 0 is Ermir
First name at array 1 is P#1First name at array 2 is Kevin
First name at array 3 is Blaus
First name at array 4 is Adam
我也想知道为什么当我在这里重新分配时,如果输入第二个名字,我得到一个重新分配错误。
if (counter != 0) {
pt = realloc(pt, sizeof(pt) * 10); //realloc(pt, sizeof(pt) * counter + 1) wont work
}
最佳答案
char decision = '\0';
...
fgets(&decision, 2, stdin);
您仅分配1个字符,但至少要读取2个字符。通过分配足够大小的数组进行决策来解决。
无关,但在firstName()中,
pt[i].firstName = calloc (MAX_LENGTH, sizeof(pt));
应该是pt[i].firstName = calloc (MAX_LENGTH, 1);