[英]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.