[英]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.