在C中的while循环内外返回一个值

在C中的while循环内外返回一个值,c,linux,while-loop,return,C,Linux,While Loop,Return,我想写一个程序来读取一个文件并分解它的内容。该文件基本上包含一个包含ID的字符串。该文件的内容如下所示: [root@ben-pc ~]# cat file 1,2,3 char ** result = get_members...; char *current_member; while((current_member = result++)) { // do something with current_member } 我想分别从解析函数中获取返回的ID 1、2、3。在我的代

我想写一个程序来读取一个文件并分解它的内容。该文件基本上包含一个包含ID的字符串。该文件的内容如下所示:

[root@ben-pc ~]# cat file
1,2,3
char ** result = get_members...;
char *current_member;

while((current_member = result++)) {
    // do something with current_member
}
我想分别从解析函数中获取返回的ID 1、2、3。在我的代码中,我得到while循环内的前两个ID和while循环外的最后一个ID。但我无法正确返回所有这些值。我知道我不能在这样的代码中使用两个
return
调用。有谁能建议我怎样才能让它按预期工作。这是我的密码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>

char *get_group_members (char* file)
{
    FILE *fp;
    char *str;
    char filename[64];
    int c;
    size_t n = 0;

    snprintf(filename, sizeof(char) * 64, "/home/ben/%s", file);
    fp = fopen(filename, "r");

    if(fp == NULL)
    {
            perror("Error opening file");
    }

    str = malloc(100);

    while ((c = fgetc(fp)) != EOF )
    {
            if(c != ',')
            {
                    str[n++] = (char) c;
            }
            else
            {
                    //return str; Not working
                    printf("%s,", str);
                    n = 0;
            }
    }
    //return str; Not working
    printf("%s", str);
    fclose(fp);
}

int main (void)
{
printf("Group Members are ::\n");
printf("%s\n", get_group_members("file"));
return 0;
}
#包括
#包括
#包括
#包括
char*获取组成员(char*文件)
{
文件*fp;
char*str;
字符文件名[64];
INTC;
尺寸n=0;
snprintf(文件名,sizeof(char)*64,“/home/ben/%s”,文件);
fp=fopen(文件名,“r”);
如果(fp==NULL)
{
perror(“打开文件时出错”);
}
str=malloc(100);
而((c=fgetc(fp))!=EOF)
{
如果(c!=',')
{
str[n++]=(char)c;
}
其他的
{
//返回str;不工作
printf(“%s”,str);
n=0;
}
}
//返回str;不工作
printf(“%s”,str);
fclose(fp);
}
内部主(空)
{
printf(“组成员为::\n”);
printf(“%s\n”,获取组成员(“文件”);
返回0;
}

这里有两个主要选项:要么返回字符串数组,要么执行增量解析

  • 增量解析:不是在函数中打开文件,而是传递一个已打开的
    文件*
    。然后,该函数返回下一个成员(作为单个字符串),如果没有其他成员,则返回0。fopen/fclose必须由调用函数管理,用法可能如下所示(省略错误检查):

    增量解析的好处在于,您不需要一次将所有返回的数据存储在内存中,也不需要事先知道要返回的元素数(为它们分配存储),如果读取的元素比预期的多,也不需要处理realloc

    示例实现:

    char *get_group_member (FILE *fp)
    {
        char *str = malloc(100);
        int n = 0;
        int c;
    
        while ((c = fgetc(fp)) != EOF)
        {
            if(c != ',')
            {
                str[n++] = (char) c;
            }
            else
            {
                break;
            }
        }
    
        if(n)
        {
            str[n++] = 0;
            return str;
        }
    
        free(str);
        return 0;
    }
    
    注意:与原始实现一样,如果任何单个成员的长度超过99个字符,则该实现会出现缓冲区溢出

  • 字符串数组:返回一个
    char**
    ,其大小为numberOfItems+1,以0结尾

    在这样的数组上迭代很容易,如下所示:

    [root@ben-pc ~]# cat file
    1,2,3
    
    char ** result = get_members...;
    char *current_member;
    
    while((current_member = result++)) {
        // do something with current_member
    }
    
  • 或者使用两个out参数,如下所示:

    [root@ben-pc ~]# cat file
    1,2,3
    
    char ** result = get_members...;
    char *current_member;
    
    while((current_member = result++)) {
        // do something with current_member
    }
    
    void get\u members\u…(字符**结果,整数*结果大小)

    然后分配一个大小合适的数组,并相应地设置结果大小

  • 您也可以创建类似于链表的内容,但这使得使用结果更复杂,通常需要更多代码


while循环内的第一次返回将终止该功能。将跳过剩余的代码。您可以返回char*数组。在函数末尾返回如何?在从函数返回之前,您不会用0终止您的字符串。您还应该关闭
get_group_members
中的文件,即使这不是问题,因为在调用
get_group_members
后,程序仍将立即退出。在函数结束时返回@EOF只会给出最后一个数字。感谢您如此清楚地解释。我将尝试以同样的方式实施。