C读弦

时间:2015-10-31 21:58:01

标签: c arrays linux string

我在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。

3 个答案:

答案 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个用户的限制外,该程序还有许多其他问题,例如:

如果超过24个字符(之前用户名的大小),

fgets将无法正确读取行。超过24个字符的行将被视为多个用户名。非常不知所措。这应该被考虑在内,例如在阅读行尾后明确截断用户名。

如果该行少于24个字符,则用户名将包含\n行终止符。这也不太可能是有意的。行终止符应该是条带化的,因为它不是名称的一部分。如果一行是空的,你将获得一个带有尾随'\ n'的空名称。

在最终的打印循环中,您应该使用循环索引k访问userVect中的名称,而不是写入j,或者您不会看到太多:只重复多次的姓氏,即未初始化的堆栈内存。它可以是任何东西。

修理不多,但应该修复你看到的内容。