[問題] 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