如何将几个字符从char []复制到C中的char *?

时间:2009-01-07 19:08:44

标签: c unix

哟!

我正在尝试将一些字符从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);

任何回复都会有所帮助!

5 个答案:

答案 0 :(得分:10)

我认为你的意思是......

strncpy(filename, buffer+5, msgLen-9);

问题是你没有分配任何内存来保存你正在复制的字符。 “filename”是一个指针,但它没有指向任何东西。

要么宣布

char filename[512];

或malloc为新名称的一些内存(并且不要忘记free()它...)

在代码中使用strncpy()有一些问题。

  • 缓冲区+ 5点到字符串中的第六个字符(“T”),而你说你想要反斜杠。
  • 最后一个参数是要复制的最大字节数,因此应该是msglen-13。
  • 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是指向已分配内存的指针,您可以自由使用它,包括从缓冲区向其复制数据。如果您只复制有限的区域,请确保将文件名留空.-