簡體   English   中英

C讀弦

[英]C reading strings

我在C中有此程序,我正試圖從文件中獲取字符串並將其放入數組中。 它非常適合讀取文件,但似乎與數組中的assign混淆了。

    int getUsers(){
    char userVect[5][25];
    char user[24];
    int i = 0, j = 0, k;

    FILE  *usernames;
    usernames = fopen("usernames.cfg", "r");
    if (usernames == NULL){
        perror("usernames - err");
        return(-1);
    }
    while(!feof(usernames)){
        fgets(user, sizeof(user), usernames);
        strcpy(userVect[j], user);
        j++;
    }

    fclose(usernames);
    for(k=0; k<j; k++)
        printf("Usernames are:  %s\n", userVect[j]);

    return 0;
}

肯定是來自用戶變量或strcpy函數,但不確定是什么。 謝謝。

請參見為什么“ while(!feof(file))”總是錯誤的?

我的建議是避免與while (!feof(username))使用相關的問題。

如果fgets無法讀取任何數據,則返回NULL。 while循環的條件可以修改為使用該值。

while(fgets(user, sizeof(user), usernames) != NULL){
    strcpy(userVect[j], user);
    j++;
}

只要輸入文件中有5行或更少的行,其余代碼即可。 您可以通過添加另一項檢查來使其更強大。

while( j < 5 && fgets(user, sizeof(user), usernames) != NULL ){
    strcpy(userVect[j], user);
    j++;
}

您還需要修復printf行以使用k而不是j

printf("Usernames are:  %s\n", userVect[k]); // Use k, not j.

如評論中所述, 您不應使用feof 由於fgets將在錯誤或文件結束時返回NULL ,因此可以將其用於循環條件。

while(fgets(user, sizeof(user), usernames)) {
    strcpy(userVect[j], user);
    j++;
}

另一個問題在這里:

for(k=0; k<j; k++)
    printf("Usernames are:  %s\n", userVect[j]);

您的循環變量是k ,但是您使用的是j 這就是為什么看到垃圾輸出的原因。

for(k=0; k<j; k++)
    printf("Usernames are:  %s\n", userVect[k]);

除了feof的麻煩和不考慮5個用戶的限制之外,該程序還有許多其他問題,例如:

如果超過24個字符(之前的用戶名大小), fgets將無法正確讀取行。 超過24個字符的行將被視為多個用戶名。 非常不可能。 應該考慮到這一點,例如在讀取行尾后顯式截斷用戶名。

如果該行少於24個字符,則用戶名將包含\\n行終止符。 這也是不太可能的。 行終止符可能應該是帶條紋的,因為它不是名稱的一部分。 如果一行為空,您將得到一個空名,后跟'\\ n'。

在最后的打印循環中,您應該使用循環索引k訪問userVect中的名稱,而不是寫的j,否則您將看不到太多:只有姓氏旁邊的名字重復了多次,這是未初始化的堆棧內存。 從字面上看,什么都可以。

修復不多,但是應該可以修復您看到的內容。

暫無
暫無

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

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