c++ 如何将两个char指针合并为一个?

ncgqoxb0  于 2023-07-01  发布在  其他
关注(0)|答案(3)|浏览(223)

我想知道我怎么能concat两个字符指针,如果它甚至是可能的?我这里有个密码

char* partOne = "1234"; // could have a known N number of bytes
    char* partTwo = "5678"; // could have a known M number of bytes

    char newPart[N+M];
    for(int i= 0; i<N; i++){
       newPart[i++] = *partOne++;
    }
    for(int i = N, j=0; j < M; j++){
       newPart[i++] = *partTwo++;
    }

    std::cout << (char *) newPart << std::endl;

这可能实现吗?
编辑:为了清楚为什么使用char指针是由于UDP套接字。例如:数据我收到我有消息的长度在头

while(!closed){
   int bytesReceived = myApi.readData(); // N bytes
   if(bytesReceived <= 0){
       continue;
   }
   char *buffer = myApi.getBuffer(); // returns char * buffer 
   do{
     if(startOf(buffer)){
      //if true check for length of the message
      int messagelen = getMessageLength(buffer);
      while(bytesReeceived < messagelen){
          char * partialBuffer;
          int partialBytesReceived = myApi.readData(); //M bytes
          if(partialBytesReceived <= 0) continue;
          partialBuffer = myApi.getBuffer();
          .....
          //concat two pointers here

         // update N bytesReceived, N += M;
          
      }
    }
  } while(*buffer != '\0');
}

实际上,我只能在每次调用更新的char * buffer时访问它。我想考虑来自UDP套接字的部分消息和收到的字节

qyuhtwio

qyuhtwio1#

正确的方法很简单:

int main(){

    std::string partOne = "1234";
    std::string partTwo = "5678";

    std::string newPart = partOne + partTwo;

    std::cout << newPart << std::endl;

}
sqxo8psd

sqxo8psd2#

由于您使用的是C风格的字符串(字符数组),因此可以使用strcpystrcat连接它们。

#include <iostream>
#include <cstring>

int main() {
    char* partOne = "1234"; // could have a known N number of bytes
    char* partTwo = "5678"; // could have a known M number of bytes

    // In reality you'd want to use `strlen` and allocate on the heap
    // for this, so that you can deal with any size of buffer
    char newPart[N+M+1];
    // Copy the first string in
    std::strcpy(newPart, partOne);
    // Then add (concatenate) the second string to the end
    std::strcat(newPart, partTwo);

    std::cout << newPart << '\n';
}

但是,您应该记住,在C++代码中使用C风格的字符串通常是一个坏主意。从缓冲区创建std::string对象并使用+操作符连接它们会更安全。这样做可以减少缓冲区溢出和其他错误的风险。

mrzz3bfm

mrzz3bfm3#

在你的例子中,你想要 * 避免 * 字符串连接。(你可以通过构造一个std::string和一个std::string_view来做到这一点,对每个都使用开始指针和长度,然后使用+操作符,但这是无意义的复制)。
相反,安排后续的读取以 append 到您已经拥有的数据。
标准模式如下:

char buffer[BUFSIZE];
char *p = buffer;
std::size_t len = sizeof buffer;
while (/*need more data*/) {
    auto bytes_read = read(input_fd, buf, len);
    if (bytes_read <= 0) {
        /* error handling here */
        return FAILURE_CODE;
    }
    p += bytes_read;
    len -= bytes_read;
}

然后,我们存储了p-buffer字节,从buffer开始连续存储。

相关问题