哟!
我正在尝试将一些字符从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);
任何回复都会有所帮助!
答案 0 :(得分:10)
我认为你的意思是......
strncpy(filename, buffer+5, msgLen-9);
问题是你没有分配任何内存来保存你正在复制的字符。 “filename”是一个指针,但它没有指向任何东西。
要么宣布
char filename[512];
或malloc为新名称的一些内存(并且不要忘记free()它...)
在代码中使用strncpy()有一些问题。
此外,从可读性的角度来看, 我更喜欢
strncpy(filename,& buffer [4],msgLen-(9 + 4));
& buffer [5]是数组中第五个位置的字符的地址。不过,这是个人的事情。
另外,值得指出“recv”的结果可能是一个字节或512个字节。它不会只读一行。你应该真正循环调用recv,直到你有一个完整的行来使用。
答案 1 :(得分:5)
首先,您应该为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.
此外,您应该确保在字符串末尾添加空值,因为strncpy
没有这样做。
filename[msgLen-4-9] = 0;
您还可以使用memcpy
代替strncpy
,因为您只想复制一些字节:
memcpy(filename, buffer+4, msgLen-4-9);
fileName[msgLen-4-9] = 0;
在任何一种情况下,请确保验证您的输入。您可能会从套接字收到无效输入。
答案 2 :(得分:1)
您的示例代码包含以下行:
char* filename;
这是一个未初始化的指针 - 它无处可指,并且没有任何存储支持。你需要为它分配一些内存,例如使用malloc()
(并在完成后记住free()
),或者,在这种情况下,您可以简单地将其声明为字符数组,例如。
char filename[SOME_BUFFER_SIZE];
在堆栈上声明一个数组的优点是,当你完成它时,你不需要明确地释放它。
从根本上说,C中的数组只是隐藏指针的语法糖,所以你可以(通常)将char[]
视为char*
。
答案 3 :(得分:1)
您没有为文件名分配任何空间
用
之类的东西替换filename的声明char filename[512]
或(可能更好)为文件名留出足够的空间
filename = (char *)malloc(msgLen - 9 - 6 + 1 ); /* + 1 for the terminating null */
答案 4 :(得分:0)
您还没有为文件名分配任何内存空间。 它是一个指针......但是在初始化之前,它指向一些随机的内存区域。
您需要为文件名分配内存。正如Roddy所说,你可以将filename声明为512字节。或者你可以:
filename = (char*)malloc(512*sizeof(char));
(注意:sizeof(char)不是严格需要的,但我认为有助于澄清所分配的内容)。
在此语句之后,filename是指向已分配内存的指针,您可以自由使用它,包括从缓冲区向其复制数据。如果您只复制有限的区域,请确保将文件名留空.-