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个回答

楼主,代码中之所以比对失败,可以归纳为以下几点:按照下面修改,应该就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))

xxp1993111
守望者xxp OK了。用的你说的改法。谢谢
接近 2 年之前 回复

recvmsg貌似也没什么用,把36行的
if(0==strcmp(data,recvmsg)){
直接改为
if(0==strcmp(data,msg)){
行不行呢?

xxp1993111
守望者xxp 按楼上的方法可以了。
接近 2 年之前 回复

可以可以。碰见高手了。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐