2219|4

483

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

C语言问题。 [复制链接]

C字符串函数 char *strstr(char *str1, const char *str2);传入的参数必须是char *p


现在我在stm32上定义了一个中文 GB2312编码的字符串 比如 unsigned char p[]="好好学习abcd"
现在需要找出 习 的位置,应该调用哪个函数啊?
此帖出自stm32/stm8论坛

最新回复

如果纠结char * 与unsigned char *, 你大可将你的字符串用char* 定义  详情 回复 发表于 2016-7-7 16:03
点赞 关注
 

回复
举报

1234

帖子

4

TA的资源

纯净的硅(高级)

沙发
 
本帖最后由 ywlzh 于 2016-7-6 17:35 编辑

这个问题也不难,你主要是要知道一个中文字符占几个字节,2个!

那么先包含头文件
  1. #include <string.h>
复制代码
然后是程序部分     
        u8 x=0;
        unsigned char p[13]="好好学习abcd";
        unsigned char ptr[3]="习";        
        char *R_p;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2

         LCD_Init();           //初始化LCD FSMC接口
        POINT_COLOR=RED;      //画笔颜色:红色
        
        R_p=strstr(p,ptr);  //这个是重点!

        if(R_p){
                LCD_ShowString(30,40,210,24,24,"baohan");
                for(x=0;x<13;x++){
                        if(p[x]==ptr[0])
                                if(p[x+1]==ptr[1]){
                                        LCD_ShowString(30,70,210,30,24,"weizhi:");
                                  LCD_ShowxNum(30,90,x,24,24,1);
                                }
                }
        }else{
                LCD_ShowString(30,40,210,24,24,"bubaohan");
        }

以上用拼音先代替着,可别学我
看结果:


最后: 程序你要是想深入,可以继续优化,我这只是一个解决的办法,更多的你也可以去解决



吐槽一句,发出来的代码被吞了大部分搞了半天才好,最后不用<>


此帖出自stm32/stm8论坛

点评

谢谢大大的热情帮助。 因为strstr(p,ptr);这个函数传入的参数是char * 如果使用unsigned char *做实参传入,要报错,所以呢,我在度娘上看到了一段strstr()函数的实现代码,就抄过来,然后将形参设置成unsignerd ch  详情 回复 发表于 2016-7-7 11:10
 
个人签名天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
 

回复

26

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
大神真认真。
此帖出自stm32/stm8论坛
 
 

回复

483

帖子

0

TA的资源

纯净的硅(初级)

4
 
本帖最后由 yl20084784 于 2016-7-7 11:11 编辑
ywlzh 发表于 2016-7-6 17:30
这个问题也不难,你主要是要知道一个中文字符占几个字节,2个!

那么先包含头文件
然后是程序部分      ...

谢谢大大的热情帮助。
因为strstr(p,ptr);这个函数传入的参数是char * 如果使用unsigned char *做实参传入,要报错,所以呢,我在度娘上看到了一段strstr()函数的实现代码,就抄过来,然后将形参设置成unsignerd char 就不会报错了。当然了,强制转换也可以。不过貌似在我用的使用环境下面有点问题。
最后贴上这段代码,供参考
int StringFind(unsigned char *pSrc, unsigned char *pDst)  
{  
    volatile int i, j;
    for (i=0; pSrc!='\0'; i++)  
    {  
        if(pSrc!=pDst[0])  
            continue;         
        j = 1;  //网上的代码是 j=0;我改成了j=1,反正这样工作OK了
        while((pDst[j]!='\0') && (pSrc[i+j]!='\0'))  
        {  
            j++;  
            if(pDst[j]!=pSrc[i+j])  
            break;  
        }
        
        if(pDst[j]=='\0')  //变量 i 如果不加volatle,会被MDK编译优化掉
        {
        
         return i;
        }
                        
    }  
    return -1;  
}
此帖出自stm32/stm8论坛

点评

如果纠结char * 与unsigned char *, 你大可将你的字符串用char* 定义  详情 回复 发表于 2016-7-7 16:03
 
 
 

回复

1234

帖子

4

TA的资源

纯净的硅(高级)

5
 
yl20084784 发表于 2016-7-7 11:10
谢谢大大的热情帮助。
因为strstr(p,ptr);这个函数传入的参数是char * 如果使用unsigned char *做实参传 ...

如果纠结char * 与unsigned char *, 你大可将你的字符串用char* 定义
此帖出自stm32/stm8论坛
 
个人签名天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表