[问题] C字串的问题

楼主: d630200x (DOGE)   2019-05-09 17:03:11
这是我在写socket时遇到的问题,平台是linux
我在收到封包后,先取出packetID:
if(rcvlen > 0){
printf("rcvbuffer : %s\n", rcvBuffer);
char pID[3];
memcpy(pID, &rcvBuffer[1], sizeof(char[2]));
if(strcmp(pID, "01") == 0){
//...
}
}
第一次收到封包时,可以正常进入if,但收到第二个封包之后就不能了
于是我想说把pID印出来看看:
if(rcvlen > 0){
printf("rcvbuffer : %s\n", rcvBuffer);
char pID[3];
memcpy(pID, &rcvBuffer[1], sizeof(char[2]));
printf("pID : %s\n", pID);
if(strcmp(pID, "01") == 0){
//...
}
}
然后我不管几个封包都能正常进入if了,请问这是什么问题?
作者: Schottky (顺风相送)   2019-05-09 17:18:00
pID 没有 initialize,建议在 char pID[3] 后面加一行memset(pID, 0, sizeof(char)*3);pID[2] 不是 '\0' 的状况下 printf 和 strcmp 都会出槌
楼主: d630200x (DOGE)   2019-05-09 17:33:00
不太懂为什么pID[2]一定要是null,c字串不是只要结尾有null就可以成立了吗?
作者: asilzheng (asil)   2019-05-09 18:21:00
pID[2]就是结尾啊
作者: bben900911 (Ben)   2019-05-09 18:23:00
strcmp要比对的分别是0, 1, \0,所以第三个位置自然得要是结尾\0
楼主: d630200x (DOGE)   2019-05-09 19:17:00
阿抱歉太想睡了刚刚脑抽
作者: Schottky (顺风相送)   2019-05-10 15:39:00
只 memcpy 前两个 byte 当然第三个得自己填结尾 null然后我提的 memset 整个清空是比较安全的万用解法今天你的状况也可以直接 pID[2] = '/0'; 处理

Links booklink

Contact Us: admin [ a t ] ucptt.com