作者d630200x (DOGE)
看板C_and_CPP
標題[問題] C字串的問題
時間Thu May 9 17:03:11 2019
這是我在寫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了,請問這是甚麼問題?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 210.63.206.65
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1557392596.A.04C.html
→ Schottky: pID 沒有 initialize,建議在 char pID[3] 後面加一行 05/09 17:18
→ Schottky: memset(pID, 0, sizeof(char)*3); 05/09 17:19
→ Schottky: pID[2] 不是 '\0' 的狀況下 printf 和 strcmp 都會出槌 05/09 17:20
→ d630200x: 不太懂為什麼pID[2]一定要是null,c字串不是只要結尾有n 05/09 17:33
→ d630200x: ull就可以成立了嗎? 05/09 17:33
→ asilzheng: pID[2]就是結尾啊 05/09 18:21
推 bben900911: strcmp要比對的分別是0, 1, \0,所以第三個位置 05/09 18:23
→ bben900911: 自然得要是結尾\0 05/09 18:23
→ d630200x: 阿抱歉太想睡了剛剛腦抽 05/09 19:17
推 Schottky: 只 memcpy 前兩個 byte 當然第三個得自己填結尾 null 05/10 15:39
→ Schottky: 然後我提的 memset 整個清空是比較安全的萬用解法 05/10 15:40
推 Schottky: 今天你的狀況也可以直接 pID[2] = '/0'; 處理 05/10 15:44