簡體   English   中英

試圖找出為什么我的結構指針存儲不正確的數據

[英]Trying to figure out why my struct pointer is storing data inaccurately

我正在努力提高自己的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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM