- 主题:C函数返回结构体很简单的程序,执行帮忙给看看
很简单的结构体返回值访问问题;绕不出来,帮忙给看看是什么问题,或者有更好的办法解析字符串也可以,谢谢
#include <stdio.h>
#include <string.h>
char IP_config[100]= "IPv4:192.168.200.245,Mask:255.255.255.245,Gateway:192.168.200.255,DHCP:0,VlanFlag:0,VlanID:0";
char IP_config2[100]= "IPv4:192.168.20.10,Mask:255.255.255.0,Gateway:192.168.20.1,DHCP:0,VlanFlag:0,VlanID:10";
typedef struct
{
/* data */
char *a;
char *b;
} st;
st struct_test_func(char *str){
// char *mask_ = strstr(str,"Mask");
// char *gateway_ = strstr(str,"Gateway");
st tt;
//get the ip number string
int i=0,j=0;
char IPtemp[16];
str=str+5;
while(*str!=','){
IPtemp[i] =*str;
i++;str++;
}
str++;
IPtemp[i]='\0';
char ipstr[16]="";
tt.a = IPtemp;
printf("ip %s\r\n",tt.a);
//get the mask number string
i=0;str=str+5;
char MaskTemp[16];
while(*str!=','){
MaskTemp[i] =*str;
i++;str++;
}
str++;
MaskTemp[i]='\0';
tt.b =MaskTemp;
printf("mask %s\r\n",tt.b);
return tt;
}
int main() {
st mm = struct_test_func(IP_config);
printf("%s\r\n%s\r\n",mm.a,mm.b);
st mm2 = struct_test_func(IP_config2);
printf("%s\r\n%s\r\n",mm2.a,mm2.b);
return 0;
}
打印结果怎么不对呢,谢谢;对指针又忘了,指点一下,谢谢
ip 192.168.200.245
mask 255.255.255.245
╔
帻a
ip 192.168.20.10
mask 255.255.255.0
╔
帻a
--
FROM 111.206.214.*
一、用正则式析取
二、先用逗号split,再用冒号把key:value给split
你这个代码,如果遇到故意构造的输入,直接就崩了,比如长度小于5的串,或者根本没逗号的串
--
修改:z16166 FROM 111.199.145.*
FROM 111.199.145.*
IPtemp、MaskTemp都是在栈上的数据,函数返回后,这个内存被回收,返回给main的tt中的a和b指向这些无效的数据
【 在 steven2012 的大作中提到: 】
: 很简单的结构体返回值访问问题;绕不出来,帮忙给看看是什么问题,或者有更好的办法解析字符串也可以,谢谢
: #include <stdio.h>
: #include <string.h>
: ...................
--
FROM 39.144.55.*
看得很仔细啊
【 在 e729 的大作中提到: 】
: IPtemp、MaskTemp都是在栈上的数据,函数返回后,这个内存被回收,返回给main的tt中的a和b指向这些无效的数据
:
--
FROM 111.199.145.*
我这个代码跑在嵌入式里面,格式固定死了,上层也是这么个格式
【 在 z16166 的大作中提到: 】
: 一、用正则式析取
: 二、先用逗号split,再用冒号把key:value给split
: 你这个代码,如果遇到故意构造的输入,直接就崩了,比如长度小于5的串,或者根本没逗号的串
: ...................
--
FROM 111.206.214.*
嗯,看来是这样,我被python祸害的不浅。尝试吧这两个变量写成static,但是结果一样,求问怎么写这个返回值,谢谢
【 在 e729 的大作中提到: 】
: IPtemp、MaskTemp都是在栈上的数据,函数返回后,这个内存被回收,返回给main的tt中的a和b指向这些无效的数据
:
--
FROM 111.206.214.*
如果从函数中返回数组的话,建议你传一个指针给这个函数。
st* createOBJ(void){
st *obj = (st*)malloc(sizeof(st));
/*
初始化结构体里的各种数组
*/
return obj;
}
把初始化过的指针传给函数。
用完后记得把这个指针占用的空间释放。
【 在 steven2012 的大作中提到: 】
: 嗯,看来是这样,我被python祸害的不浅。尝试吧这两个变量写成static,但是结果一样,求问怎么写这个返回值,谢谢
: :
--
修改:xzh FROM 120.230.79.*
FROM 120.230.79.*
一个比较笨拙的办法是把st中的a和b定义为char a[len], b[len],无需更改其它;
但是,以效率和速度著称的c语言,操作struct时,一般都结合指针来操作。那么第二种比较优雅也是正确的处理方式是st被定义为指针,就是*st,函数大致修改如下
st struct_test_func(char *str){
st tt = malloc(sizeof(xxx));
tt->a = malloc(strlen(xxx) + 1);
tt->b = malloc(strlen(xxx) + 1);
strcpy(tt->a, xxx);
strcpy(tt->b, xxx);
return tt
}
需要注意的是,当这个结构不在使用时,要先释放a和b,再释放tt,稍显麻烦,但你上面的回帖说程序是跑在嵌入式平台的,那么显然你必须要用第二种方法。
【 在 steven2012 的大作中提到: 】
: 嗯,看来是这样,我被python祸害的不浅。尝试吧这两个变量写成static,但是结果一样,求问怎么写这个返回值,谢谢
: :
--
FROM 39.144.55.*
建议学习一下C的内存管理,重点是堆和栈的概念。
你的临时变量都是在栈上分配的,函数返回后就被释放了,在main函数访问会出问题。
可以用malloc分配空间,回头记得释放。
【 在 steven2012 的大作中提到: 】
: 嗯,看来是这样,我被python祸害的不浅。尝试吧这两个变量写成static,但是结果一样,求问怎么写这个返回值,谢谢
:
: :
: --
发自「今日水木 on TV」
--
FROM 111.201.2.*
建议返回结构指针,结构在外部定义,传进去,再传出来。
【 在 steven2012 的大作中提到: 】
: 很简单的结构体返回值访问问题;绕不出来,帮忙给看看是什么问题,或者有更好的办法解析字符串也可以,谢谢
: #include <stdio.h>
: #include <string.h>
: ...................
--
FROM 221.221.50.*