在C中的while循环内外返回一个值
我想写一个程序来读取一个文件并分解它的内容。该文件基本上包含一个包含ID的字符串。该文件的内容如下所示:在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。在我的代
[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 示例实现:文件*
注意:与原始实现一样,如果任何单个成员的长度超过99个字符,则该实现会出现缓冲区溢出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; }
- 字符串数组:返回一个
,其大小为numberOfItems+1,以0结尾 在这样的数组上迭代很容易,如下所示:char**
[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…(字符**结果,整数*结果大小)代码> 然后分配一个大小合适的数组,并相应地设置结果大小
- 您也可以创建类似于链表的内容,但这使得使用结果更复杂,通常需要更多代码
get_group_members
中的文件,即使这不是问题,因为在调用get_group_members
后,程序仍将立即退出。在函数结束时返回@EOF只会给出最后一个数字。感谢您如此清楚地解释。我将尝试以同样的方式实施。