搜索
bottom↓
回复: 9

请教keil 字符串分割程序封装成函数并调用

[复制链接]

出340入0汤圆

发表于 2013-1-10 10:36:23 | 显示全部楼层 |阅读模式
本帖最后由 ajfan 于 2013-1-10 10:39 编辑

请教各位大神,下面有一段keil 中字符串分割的程序我目前在main中运行正确,在1602的第4,第8,第12位置能正常显示分割出的"aa" "bb" "cc"字符串
但我想将该部分内容做成函数的性质调用,但一直编译不通过,请帮忙看下指点下迷津,感谢。

在main下编译通过的程序:

unsigned char buffer[]={"aa,bb,cc"};
unsigned char i=0;
unsigned char *p[3];
unsigned char *buff= buffer;

while((p=strtok(buff,","))!=NULL)
    {
     i++;
     buff=NULL;
    }
LCD_write_str(4,0,p[0]);
LCD_write_str(8,0,p[1]);
LCD_write_str(12,0,p[2]);


半途出家,自己瞎模滚打凑出来的函数,但编译不通过,也不知道该如何在main中调用
Split_String(unsigned char *buffer);
{
   unsigned char i=0;
   unsigned char *p[3];
   unsigned char *buff= buffer;
   while((p=strtok(buff,","))!=NULL)
    {
     i++;
     buff=NULL;
    }
   return p;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2013-1-10 10:40:17 | 显示全部楼层
unsigned char *buff= buffer;
buffer应该是Input_String吧!

出0入0汤圆

发表于 2013-1-10 10:41:06 | 显示全部楼层
结尾少了个}

出0入0汤圆

发表于 2013-1-10 10:44:32 | 显示全部楼层
弱弱的问一句:Split_String(unsigned char *buffer);这个是什么书写格式?函数没类型,而且在函数的定义后面竟然有";"

出340入0汤圆

 楼主| 发表于 2013-1-10 13:04:09 | 显示全部楼层
本帖最后由 ajfan 于 2013-1-10 13:15 编辑

这是strtok函数的标准用法,也是网上找的,已经在开发板上验证过是OK的,现在像把这段内容做成函数调用,下面是我自己封装的函数,除去语法的问题,我在main 中该如何调用?
是否应该是这样

unsigned char *p;
unsigned char Input_String[]={"aa,bb,cc"};
main(1)
{
p=Split_String(Input_String);
LCD_write_str(4,0,p[0]);
LCD_write_str(8,0,p[1]);
LCD_write_str(12,0,p[2]);
}




自己封装的函数(不一定对。。。。)
Split_String(unsigned char *buffer)
{
   unsigned char i=0;
   unsigned char *p[3];
   unsigned char *buff= buffer;
   while((p=strtok(buff,","))!=NULL)
    {
     i++;
     buff=NULL;
    }
   return p;
}

出0入0汤圆

发表于 2013-1-11 12:44:15 | 显示全部楼层
你这个子函数让我纠结不已啊,定义了一个指向数组的指针,但是你在while里面不停的给数组首地址赋值,但是while里面又给i进行自增运算,你这是想实现什么功能呢?另外,你返回的是数组的首地址,也就是说把这个首地址在主函数中赋值给了p,那么*p的值也就是p[0]的值,但是从子函数来看,p[0]里面应该是指针*p[0]的地址,所以,你的主函数一直在接收这个地址,然后在操作这个地址,我凌乱了

出340入0汤圆

 楼主| 发表于 2013-1-14 19:39:13 | 显示全部楼层
本帖最后由 ajfan 于 2013-1-14 19:42 编辑

谢谢毛毛雨,初学阶段,见笑了

我将程序更改了成如下形式

函数
unsigned char *Split_String (unsigned char *Input_String)
{
   unsigned char i=0;
   unsigned char *p[3];
   unsigned char *buff= Input_String;
   while((p=strtok(buff,","))!=NULL)
    {
     i++;
     buff=NULL;
    }
   return p;
}


main内该部分函数(其他LCD及初始化部分省略掉了)

unsigned char *t;
unsigned char buffer[]={"aa,bb,cc"};

  t=Split_String(buffer);
  LCD_write_str(4,0,t+0);
  LCD_write_str(8,0,t+1);
  LCD_write_str(12,0,t+2);

目前跑出来的结果为几个大坨坨,程序端应该还有比较多的错误,请各位高手再帮忙扫下盲,谢谢。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出340入0汤圆

 楼主| 发表于 2013-1-14 19:40:48 | 显示全部楼层
发重了,把内容删掉,嘿嘿

出340入0汤圆

 楼主| 发表于 2013-1-14 21:46:22 | 显示全部楼层
char buffer[]="Fred,John,Ann"
char *p[3];
char *buff = buffer;
while((p[in]=strtok(buf,","))!=NULL) {
                 i++;
                 buf=NULL; }如上代码,第一次执行strtok需要以目标字符串的地址为第一参数(buf=buffer),之后strtok需要以NULL为第一参数(buf=NULL)。指针列p[],则储存了分割后的结果,p[0]="John",p[1]="John",p[2]="Ann",而buf就变成    Fred\0John\0Ann\0。

估计是我理解错了,上面是网上有关strtok的用法,输出应该是指针数组(我的理解对么?)如P[1],而不是单纯的指针p

如果是这样的话我应该在函数里怎么定义才可以让函数返回值为“指针数组”呢?

unsigned char *Split_String (unsigned char *Input_String)
{
   unsigned char i=0;
   unsigned char *p[3];
   unsigned char *buff= Input_String;
   while((p=strtok(buff,","))!=NULL)
    {
     i++;
     buff=NULL;
    }
   return p;   (应该要返回“指针数组”而不是纯指针,这里还有函数头“unsigned char *Split_String” 应该怎么定义???)
}

出0入0汤圆

发表于 2013-1-15 12:52:34 | 显示全部楼层
ajfan 发表于 2013-1-14 21:46
char buffer[]="Fred,John,Ann"
char *p[3];
char *buff = buffer;

那我觉得你也得在主函数中定义相应的指针数组来接收返回值吧,返回p是的写法应该是没错的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 12:47

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表