作者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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1557392596.A.04C.html
1F:→ Schottky: pID 没有 initialize,建议在 char pID[3] 後面加一行 05/09 17:18
2F:→ Schottky: memset(pID, 0, sizeof(char)*3); 05/09 17:19
3F:→ Schottky: pID[2] 不是 '\0' 的状况下 printf 和 strcmp 都会出槌 05/09 17:20
4F:→ d630200x: 不太懂为什麽pID[2]一定要是null,c字串不是只要结尾有n 05/09 17:33
5F:→ d630200x: ull就可以成立了吗? 05/09 17:33
6F:→ asilzheng: pID[2]就是结尾啊 05/09 18:21
7F:推 bben900911: strcmp要比对的分别是0, 1, \0,所以第三个位置 05/09 18:23
8F:→ bben900911: 自然得要是结尾\0 05/09 18:23
9F:→ d630200x: 阿抱歉太想睡了刚刚脑抽 05/09 19:17
10F:推 Schottky: 只 memcpy 前两个 byte 当然第三个得自己填结尾 null 05/10 15:39
11F:→ Schottky: 然後我提的 memset 整个清空是比较安全的万用解法 05/10 15:40
12F:推 Schottky: 今天你的状况也可以直接 pID[2] = '/0'; 处理 05/10 15:44