将 glist 指针作为参数传递以反映列表中的更改不起作用
passing glist pointer as argument to reflect changes in list does not work
我想将 glist 指针传递给该函数,以便我可以在 main 函数中获取更改后的值。
我的代码为:
#include <stdio.h>
#include <string.h>
#include <glib.h>
char *col_trim_whitespace(char *str)
{
char *end;
// Trim leading space
while(isspace(*str)) str++;
if(*str == 0) // All spaces?
return str;
// Trim trailing space
end = str + strlen(str) - 1;
while(end > str && isspace(*end)) end--;
// Write new null terminator
*(end+1) = 0;
return str;
}
void line_parser(char *str,GSList* list1)
{
GSList* list = NULL;
char *token, *remstr=NULL ;
token = strtok_r(str,"\n",&remstr);
while(token != NULL)
{
if(token[0] == ' ')
{
token = col_trim_whitespace(token);
if(strcmp(token,"")==0)
{
token = strtok_r(NULL, "\n", &remstr);
continue;
}
}
list1 = g_slist_append(list1, token);
token = strtok_r(NULL,"\n",&remstr);
}
}
int main()
{
int *av,i,j,length;
i=0;
char str[] = " this name of \n the pet is the ffffffffffffffffffffffffffffff\n is \n the \n test\n program";
//GSList *list1 = line_parser(str);
GSList *list1 = NULL;
line_parser(str,list1 );
// printf("The list is now %d items long\n", g_slist_length(list));
length = g_slist_length(list1);
// printf("length=%d", length);
for(j=0;j<length;j++)
{
printf("string = %s\n",(char *)g_slist_nth(list1,j)->data);
}
g_slist_free(list1);
return 0;
}
这里我在主函数中有一个列表名称 list1
,然后我将 list1
作为参数传递给 lineparser()
函数,其中列表被更改并附加了一些值。我想 return main()
函数的值,但不使用 return
语句,因为我在传递参数时使用了指针引用。但该值未 returned 到 main()
函数。我怎样才能做到这一点?
您似乎想传递列表指针的地址,然后让解析器更新该变量:
void line_parser(char *str,GSList **list1)
{
...
*list1= list;
}
主要是:
main()
{
GSList *list1 = NULL;
line_parser(str, &list1);
...
}
如上所示,g_slist_append()
returns new 列表的起始指针。因此,从本质上讲,您正在尝试更改 line_parser()
中的 list1
值并期望该值反映回 main()
.
嗯,在目前的形式下这是不可能的。 C
使用按值传递函数参数传递,因此传递给函数的所有参数都是 单独的本地副本 到被调用函数,同时将其视为参数调用函数。
如果要将对list1
的更改反映到main()
,则需要使用指向指针的指针作为输入参数。
类似
的东西
void line_parser(char *str,GSList** list1) { //and other usage
和
line_parser(str,&list1 );
应该可以解决你的问题。
有很多方法可以做到这一点。一种方式:
这一行 GSList *list1 = NULL;
创建了一个指针,而不是 GSList
结构。您可能希望使用 malloc
为列表分配内存并将其转换为 GSList
。例如,GSList list1 = (GSList) malloc(sizeof(GSList));
然后在你的函数中line_parser
我们需要传递一个指针line_parser(str, &list1)
记得free(list1)
另一种方法是在堆栈上创建 GSList
。无论如何,我们仍然传递一个指向 line_parser
的指针,如上所述。
我想将 glist 指针传递给该函数,以便我可以在 main 函数中获取更改后的值。
我的代码为:
#include <stdio.h>
#include <string.h>
#include <glib.h>
char *col_trim_whitespace(char *str)
{
char *end;
// Trim leading space
while(isspace(*str)) str++;
if(*str == 0) // All spaces?
return str;
// Trim trailing space
end = str + strlen(str) - 1;
while(end > str && isspace(*end)) end--;
// Write new null terminator
*(end+1) = 0;
return str;
}
void line_parser(char *str,GSList* list1)
{
GSList* list = NULL;
char *token, *remstr=NULL ;
token = strtok_r(str,"\n",&remstr);
while(token != NULL)
{
if(token[0] == ' ')
{
token = col_trim_whitespace(token);
if(strcmp(token,"")==0)
{
token = strtok_r(NULL, "\n", &remstr);
continue;
}
}
list1 = g_slist_append(list1, token);
token = strtok_r(NULL,"\n",&remstr);
}
}
int main()
{
int *av,i,j,length;
i=0;
char str[] = " this name of \n the pet is the ffffffffffffffffffffffffffffff\n is \n the \n test\n program";
//GSList *list1 = line_parser(str);
GSList *list1 = NULL;
line_parser(str,list1 );
// printf("The list is now %d items long\n", g_slist_length(list));
length = g_slist_length(list1);
// printf("length=%d", length);
for(j=0;j<length;j++)
{
printf("string = %s\n",(char *)g_slist_nth(list1,j)->data);
}
g_slist_free(list1);
return 0;
}
这里我在主函数中有一个列表名称 list1
,然后我将 list1
作为参数传递给 lineparser()
函数,其中列表被更改并附加了一些值。我想 return main()
函数的值,但不使用 return
语句,因为我在传递参数时使用了指针引用。但该值未 returned 到 main()
函数。我怎样才能做到这一点?
您似乎想传递列表指针的地址,然后让解析器更新该变量:
void line_parser(char *str,GSList **list1)
{
...
*list1= list;
}
主要是:
main()
{
GSList *list1 = NULL;
line_parser(str, &list1);
...
}
如上所示,g_slist_append()
returns new 列表的起始指针。因此,从本质上讲,您正在尝试更改 line_parser()
中的 list1
值并期望该值反映回 main()
.
嗯,在目前的形式下这是不可能的。 C
使用按值传递函数参数传递,因此传递给函数的所有参数都是 单独的本地副本 到被调用函数,同时将其视为参数调用函数。
如果要将对list1
的更改反映到main()
,则需要使用指向指针的指针作为输入参数。
类似
的东西 void line_parser(char *str,GSList** list1) { //and other usage
和
line_parser(str,&list1 );
应该可以解决你的问题。
有很多方法可以做到这一点。一种方式:
这一行
GSList *list1 = NULL;
创建了一个指针,而不是GSList
结构。您可能希望使用malloc
为列表分配内存并将其转换为GSList
。例如,GSList list1 = (GSList) malloc(sizeof(GSList));
然后在你的函数中
line_parser
我们需要传递一个指针line_parser(str, &list1)
记得
free(list1)
另一种方法是在堆栈上创建 GSList
。无论如何,我们仍然传递一个指向 line_parser
的指针,如上所述。