守望者xxp 2018-11-07 08:23 采纳率: 100%
浏览 1165
已采纳

linux C语言strcmp报错。

内核上传一个字符串,我在应用层拿到以后对它进行判断,发现明明一样的两个字符串,就是不相等。然后我随手加了一个比较又是ok的,是不是这个指针传的有问题?
如下

130 //接受内核态确认信息
131 ret = recvfrom(skfd, &info, sizeof(struct u_packet_info),0, (struct sockaddr*)&kpeer, &kpeerlen);
132 if(!ret){
133 perror("recv form kerner:");
134 exit(-1);
135 }
136
137 receiveMSG = (HI_CHAR *)info.msg;
138
139 printf("message receive from kernel:%s\n",(HI_CHAR *)info.msg);
140 printf("receiveMSG: %s\n",receiveMSG);
141 //内核和用户进行通信
142
143
144 msgCtrl(receiveMSG);

27 void msgCtrl(HI_CHAR *msg){
28 //mediarevert
29 printf("itachi==>msgCtrl receive : %s\n",msg);
30 HI_CHAR *data = "mediarevert";
31 HI_CHAR *recvmsg;
32
33 recvmsg = msg;
34 printf("recvmsg :%s , len = %d , data's len : %d\n",recvmsg,sizeof(recvmsg),sizeof(data));
35
36 if(0==strcmp(data,recvmsg)){
37 printf("close mediaserver in init.rc!!!\n");
38 property_set("ctl.stop", "media");
39 sleep(10);
40 printf("open mediaserver in init.rc!!!\n");
41 property_set("ctl.start", "media");
42 }else{
43 printf("invalid command-line option\n");
44 }
45
46 char *a = "10";
47 char *b = "10";
48
49 if(0==strcmp(a,b)){
50 printf("a=b\n");
51 }else{
52 printf("a != b\n");
53 }

打印如下:
message sendto kernel are:This message is from itachi's application space, len:64
message receive from kernel:mediarevert
receiveMSG: mediarevert
itachi==>msgCtrl receive : mediarevert
, len = 4 , data's len : 4
invalid command-line option
a=b

  • 写回答

3条回答 默认 最新

  • 内核之道 PostgreSQL领域优质创作者 2018-11-07 09:31
    关注

    楼主,代码中之所以比对失败,可以归纳为以下几点:按照下面修改,应该就ok了。

    receiveMSG = (HI_CHAR *)info.msg;
    //楼主说的是采用c语言,那么排查c++中的std::string类型,这样info中的msg就是一个字符数组。这里HI_CHAR应该是自定义的char* 类型
    
    printf("message receive from kernel:%s\n",(HI_CHAR *)info.msg);
    printf("receiveMSG: %s\n",receiveMSG);
    //内核和用户进行通信
    
    
    msgCtrl(receiveMSG); //指针存放的是字符串的地址,这里最好加上该字符串长度:void msgCtrl(HI_CHAR *msg, int msgLength)  //msgCtrl(receiveMSG,strlen(receiveMSG); 
    
    void msgCtrl(HI_CHAR *msg){
        //mediarevert
        printf("itachi==>msgCtrl receive : %s\n",msg);
        HI_CHAR *data = "mediarevert";
        HI_CHAR *recvmsg;   //建议指针变量初始化  HI_CHAR *recvmsg = NULL;
        recvmsg = msg;  //这里指针赋值是没有问题的。
        printf("recvmsg :%s , len = %d , data's len : %d\n",recvmsg,sizeof(recvmsg),sizeof(data)); //sizeof(recvmsg)和sizeof(data)是没有意义的,因为都是指针类型,大小为4字节。&&& 这里没有看到recvmsg的打印信息,是楼主没有复制完全,还是本来就没有打印,
        //应修改为:(1)printf("recvmsg :%s , len = %d , data's len : %d\n",recvmsg,strlen(recvmsg),strlen(data));
    
        if(0==strcmp(data,recvmsg)){  //(2)建议改为:if(!strncmp(data,recvmsg,strlen(data)))
    

    将if(0==strcmp(data,recvmsg))改为if(!strncmp(data,recvmsg,strlen(data)))就可以了。如果还不行,直接用参数msg比较看看。如:

    if(!strcmp(data,msg))
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥30 用arduino开发esp32控制ps2手柄一直报错
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿