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

Gör*_*lja 3 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);
Run Code Online (Sandbox Code Playgroud)

任何回应都会有所帮助!

Rod*_*ddy 10

我猜你的意思是......

strncpy(filename, buffer+5, msgLen-9);
Run Code Online (Sandbox Code Playgroud)

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

要么只是声明

char filename[512];
Run Code Online (Sandbox Code Playgroud)

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

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

  • 缓冲区+ 5点到字符串中的第六个字符("T"),而你说你想要反斜杠.
  • 最后一个参数是要复制的最大字节数,因此应该是msglen-13.
  • strncpy()不会为复制的字符串终止null,因此您需要手动执行此操作.
  • 另外,从可读性的角度来看,我更喜欢

    strncpy(filename,&buffer [4],msgLen-(9 + 4));

&buffer [5]是数组中第五个位置的字符的地址.不过,这是个人的事情.

此外,值得指出"recv"的结果可能是一个字节或512个字节.它不会只读一行.你应该真正循环调用recv,直到你有一个完整的行来使用.


Meh*_*ari 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.
Run Code Online (Sandbox Code Playgroud)

此外,您应该确保在字符串末尾添加null,而strncpy不是这样做.

filename[msgLen-4-9] = 0;
Run Code Online (Sandbox Code Playgroud)

你也可以使用memcpy而不是strncpy你想要只复制一些字节:

memcpy(filename, buffer+4, msgLen-4-9);
fileName[msgLen-4-9] = 0;
Run Code Online (Sandbox Code Playgroud)

在任何一种情况下,请确保验证您的输入.您可能会收到套接字的无效输入.