我在C中有这个程序,我正在尝试从文件中获取字符串并将它们放入数组中。 它非常适合读取文件,但似乎它与数组中的赋值相混淆。
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函数,但不确定是什么。 THX。
答案 0 :(得分:1)
请参阅Why is “while ( !feof (file) )” always wrong?。
我的建议是避免与使用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.
答案 1 :(得分:1)
如评论中所述,you shouldn't use 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]);
答案 2 :(得分:0)
除了feof
的问题以及未考虑5个用户的限制外,该程序还有许多其他问题,例如:
fgets
将无法正确读取行。超过24个字符的行将被视为多个用户名。非常不知所措。这应该被考虑在内,例如在阅读行尾后明确截断用户名。
如果该行少于24个字符,则用户名将包含\n
行终止符。这也不太可能是有意的。行终止符应该是条带化的,因为它不是名称的一部分。如果一行是空的,你将获得一个带有尾随'\ n'的空名称。
在最终的打印循环中,您应该使用循环索引k访问userVect中的名称,而不是写入j,或者您不会看到太多:只重复多次的姓氏,即未初始化的堆栈内存。它可以是任何东西。
修理不多,但应该修复你看到的内容。