呦!
我正在尝试将一些字符从char []复制到char*.我只想要从索引6到(消息长度 - 9)的字符.
也许代码示例将更多地解释我的问题:
char buffer[512] = "GET /testfile.htm HTTP/1.0"; char* filename; // I want *filename to hold only "/testfile.htm" msgLen = recv(connecting_socket, buffer, 512, 0); strncpy(filename, buffer+5, msgLen-9);
任何回应都会有所帮助!
我猜你的意思是......
strncpy(filename, buffer+5, msgLen-9);
问题是你没有分配任何内存来保存你正在复制的字符."filename"是一个指针,但它不指向任何东西.
要么只是声明
char filename[512];
或malloc一些内存为新名称(并且不要忘记free()它...)
在代码中使用strncpy()有一些问题.
缓冲区+ 5点到字符串中的第六个字符("T"),而你说你想要反斜杠.
最后一个参数是要复制的最大字节数,因此应该是msglen-13.
strncpy()不会为复制的字符串终止null,因此您需要手动执行此操作.
另外,从可读性的角度来看,我更喜欢
strncpy(filename,&buffer [4],msgLen-(9 + 4));
&buffer [5]是数组中第五个位置的字符的地址.不过,这是个人的事情.
此外,值得指出"recv"的结果可能是一个字节或512个字节.它不会只读一行.你应该真正循环调用recv,直到你有一个完整的行来使用.
首先,您应该为其分配缓冲区filename
.下一个问题是你的偏移.
char buffer[512] = "GET /testfile.htm HTTP/1.0"; char filename[512]; // I want *filename to hold only "/testfile.htm" msgLen = recv(connecting_socket, buffer, 512, 0); strncpy(filename, buffer+4, msgLen-4-9); //the first parameter should be buffer+4, not 5. Indexes are zero based. //the second parameter is count, not the end pointer. You should subtract //the first 4 chars too.
此外,您应该确保在字符串末尾添加null,而strncpy
不是这样做.
filename[msgLen-4-9] = 0;
你也可以使用memcpy
而不是strncpy
你想要只复制一些字节:
memcpy(filename, buffer+4, msgLen-4-9); fileName[msgLen-4-9] = 0;
在任何一种情况下,请确保验证您的输入.您可能会收到套接字的无效输入.