Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C读字符串_C_Arrays_Linux_String - Fatal编程技术网

C读字符串

C读字符串,c,arrays,linux,string,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){

我有一个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;
}
intgetusers(){
char userVect[5][25];
字符用户[24];
int i=0,j=0,k;
文件*用户名;
usernames=fopen(“usernames.cfg”,“r”);
if(用户名==NULL){
perror(“用户名-错误”);
返回(-1);
}
而(!feof(用户名)){
fgets(用户、sizeof(用户)、用户名);
strcpy(userVect[j],用户);
j++;
}
fclose(用户名);
对于(k=0;k参见

以下是我的建议,以避免在(!feof(username))
时使用
时出现的问题

如果无法读取任何数据,则返回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++;
}

如注释中所述,。由于
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]);

除了
feof
的问题和未考虑5个用户的限制之外,该程序还有许多其他问题,如示例所示:

fgets
如果超过24个字符(之前用户名的大小),则无法正确读取行。超过24个字符的行将被视为多个用户名。非常不明确的目标。这应该考虑在内,例如,在读取行尾后显式截断用户名

如果行少于24个字符,则用户名将包含
\n
行终止符。这也不太可能是预期的。行终止符可能应该分条,因为它不是名称的一部分。如果行为空,则会得到一个带尾随“\n”的空名称

在最后一个打印循环中,您应该使用循环索引k(而不是编写的j)访问userVect中的名称,否则您将看不到太多:只有姓氏旁边的名称重复多次,这是未初始化的堆栈内存。它可能是任意内容


没有太多需要修正的地方,但它应该修正您看到的内容。

see-这是Martin链接的内容,但包括标题会让它更清楚。它“似乎”会弄乱数组,或者它会弄乱数组?如果是,如何解决?请使用-一个问题应该包含所有相关信息。只要您修正
while(!feof(用户名))
条件,并且由于
usernames.cfg
文件中的条目不超过5个,并且只要名称的长度不超过23个字符,并且只要此函数之外的任何内容都不需要访问用户名,那么您得到的看起来就可以了(尽管您可能希望从名称中删除换行符)。您应该针对上限(
5
)测试
j
,以防止溢出。您的输出将是双倍行距的。您遇到了什么问题?如果我打印数组,它只会显示垃圾。我只有3个用户名,但它们之间用换行符分隔。在进行while更改时,它仍然显示如下内容:用户名是:�� 用户名是:�� 用户名是:��哦,是的,忘记了,甚至没有看到。该死,谢谢。如果现在我想返回这个数组,是否可以有一个变量类型的char用户[5]从数组中获取值,还是另一种方式?@Justplayit94,这是一个不相关的问题。最好发布另一个问题,而不是通过评论获得答案。问题和答案都在SO中的可搜索数据库中。我不认为评论是。
for(k=0; k<j; k++)
    printf("Usernames are:  %s\n", userVect[j]);
for(k=0; k<j; k++)
    printf("Usernames are:  %s\n", userVect[k]);