守望者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 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条