ajfan 发表于 2013-1-10 10:36:23

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

本帖最后由 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;
unsigned char *buff= buffer;

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


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

xiaodao35 发表于 2013-1-10 10:40:17

unsigned char *buff= buffer;
buffer应该是Input_String吧!

snoopyzz 发表于 2013-1-10 10:41:06

结尾少了个}

毛毛雨 发表于 2013-1-10 10:44:32

弱弱的问一句:Split_String(unsigned char *buffer);这个是什么书写格式?函数没类型,而且在函数的定义后面竟然有";"

ajfan 发表于 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);
LCD_write_str(8,0,p);
LCD_write_str(12,0,p);
}




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

毛毛雨 发表于 2013-1-11 12:44:15

你这个子函数让我纠结不已啊,定义了一个指向数组的指针,但是你在while里面不停的给数组首地址赋值,但是while里面又给i进行自增运算,你这是想实现什么功能呢?另外,你返回的是数组的首地址,也就是说把这个首地址在主函数中赋值给了p,那么*p的值也就是p的值,但是从子函数来看,p里面应该是指针*p的地址,所以,你的主函数一直在接收这个地址,然后在操作这个地址,我凌乱了

ajfan 发表于 2013-1-14 19:39:13

本帖最后由 ajfan 于 2013-1-14 19:42 编辑

谢谢毛毛雨,初学阶段,见笑了{:biggrin:}{:biggrin:}{:biggrin:}

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

函数
unsigned char *Split_String (unsigned char *Input_String)
{
   unsigned char i=0;
   unsigned char *p;
   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);

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

ajfan 发表于 2013-1-14 19:40:48

发重了,把内容删掉,嘿嘿

ajfan 发表于 2013-1-14 21:46:22

char buffer[]="Fred,John,Ann"
char *p;
char *buff = buffer;
while((p=strtok(buf,","))!=NULL) {
               i++;
               buf=NULL; }如上代码,第一次执行strtok需要以目标字符串的地址为第一参数(buf=buffer),之后strtok需要以NULL为第一参数(buf=NULL)。指针列p[],则储存了分割后的结果,p="John",p="John",p="Ann",而buf就变成    Fred\0John\0Ann\0。

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

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

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

毛毛雨 发表于 2013-1-15 12:52:34

ajfan 发表于 2013-1-14 21:46 static/image/common/back.gif
char buffer[]="Fred,John,Ann"
char *p;
char *buff = buffer;


那我觉得你也得在主函数中定义相应的指针数组来接收返回值吧,返回p是的写法应该是没错的
页: [1]
查看完整版本: 请教keil 字符串分割程序封装成函数并调用