看板 C_and_CPP 關於我們 聯絡資訊
這是我在寫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