簡體   English   中英

在C中的while循環內外返回一個值

[英]Return a value inside and outside the while loop in C

我想寫一個程序來讀取文件並分解其內容。 該文件基本上包含一個包含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。

  • 您也可以創建類似鏈表的內容,但是這會使使用結果更加復雜,並且通常需要更多代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM