gpt4 book ai didi

c - 在C中的while循环内部和外部返回一个值

转载 作者:太空宇宙 更新时间:2023-11-04 11:03:00 29 4
gpt4 key购买 nike

我想编写一个程序来读取文件并分解其内容。该文件基本上包含一个包含 ID 的字符串。文件内容是这样的:

[root@ben-pc ~]# cat file
1,2,3

我想从解析函数中分别返回 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;
}

最佳答案

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

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

    FILE *fd = fopen(...);
    char *member;
    while((member = get_member(fd))) {
    // do sth.

    free(member);
    }
    fclose(fd);

    增量解析的好处是你永远不需要一次将所有返回的数据存储在内存中,你既不需要事先知道要返回的元素数量(为它们分配存储空间),也不需要处理重新分配,如果你阅读比预期更多的元素。

    示例实现:

    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 结尾。

    在这样的数组上迭代很容易,看起来像这样:

    char ** result = get_members...;
    char *current_member;

    while((current_member = result++)) {
    // do something with current_member
    }
  • 或者使用两个输出参数,如下所示:

    void get_members_...(char ** result, int *result_size);

    然后您分配一个适当大小的数组并相应地设置 result_size。

  • 您也可以创建类似于链表的东西,但这会使结果的使用变得更加复杂并且通常需要更多代码。

关于c - 在C中的while循环内部和外部返回一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26277441/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com