C++ 字符串在操作过程中被剪切

C++ 字符串在操作过程中被剪切,c++,string,c++11,memory-management,C++,String,C++11,Memory Management,我想打印出像这样的东西 “插座3:你好,世界” “4号插座:你好!” 每个客户只键入他们想说的内容,但是 从服务器端,它添加每个客户机的套接字编号 但是如果我输入的内容越来越多,它就会丢失来自客户端的消息 或者像这样打印出奇怪的方块: ================================================ 端口65272上127.0.0.1的新连接 3号插座:���3号插座:fdsklj =========================================

我想打印出像这样的东西

“插座3:你好,世界” “4号插座:你好!”

每个客户只键入他们想说的内容,但是 从服务器端,它添加每个客户机的套接字编号

但是如果我输入的内容越来越多,它就会丢失来自客户端的消息 或者像这样打印出奇怪的方块:

================================================

端口65272上127.0.0.1的新连接 3号插座:���3号插座:fdsklj

================================================

我把内存管理搞砸了吗

void send_to_all(int j, int i, int sockfd, int nbytes_recvd, char *recv_buf, fd_set *master)
{
    if (FD_ISSET(j, master)){
        if (j != sockfd && j != i) {
            if (send(j, recv_buf, nbytes_recvd, 0) == -1) {
                perror("send");
            }
        }
    }
}

void send_recv(int i, fd_set *master, int sockfd, int fdmax)
{
    int nbytes_recvd, j;
    char recv_buf[BUFSIZE];

    // int sockfd -> char* sockfd_char

    std::string sockfd_string = "";

    sockfd_string = std::to_string(sockfd);
    sockfd_string = "Socket No " + sockfd_string;

    sockfd_string = sockfd_string + " : ";
    sockfd_string = sockfd_string + std::string(recv_buf);


    char* sockfd_char = new char[sockfd_string.length() + 1];
    strcpy(sockfd_char, sockfd_string.c_str());

    if ((nbytes_recvd = recv(i, recv_buf, BUFSIZE, 0)) <= 0) {
        if (nbytes_recvd == 0) {
            printf("socket %d hung up\n", i);
        }else {
            perror("recv");
        }
        close(i);
        FD_CLR(i, master);
    } else {
        for(j = 0; j <= fdmax; j++){
            send_to_all(j, i, sockfd, strlen(sockfd_char), sockfd_char, master);
        }
    }
    delete[] sockfd_char;
}
void send_to_all(int j,int i,int sockfd,int nbytes_recvd,char*recv\u buf,fd_set*master)
{
if(FD_ISSET(j,master)){
如果(j!=sockfd&&j!=i){
如果(发送(j,recv_buf,n字节,0)=-1){
佩罗(“发送”);
}
}
}
}
无效发送接收(int i、fd集合*主控、int sockfd、int fdmax)
{
国际单位记录,j;
char recv_buf[BUFSIZE];
//int sockfd->char*sockfd\u char
std::string sockfd_string=“”;
sockfd_string=std::to_string(sockfd);
sockfd_string=“插座编号”+sockfd_string;
sockfd_string=sockfd_string+“:”;
sockfd_string=sockfd_string+std::string(recv_buf);
char*sockfd_char=新字符[sockfd_string.length()+1];
strcpy(sockfd_char,sockfd_string.c_str());

如果((nbytes_recvd=recv(i,recv_buf,BUFSIZE,0))Dunno,您在哪里打印此消息?为什么要将字符串复制到
char*
?您不能将
send\u to\u all
签名更改为接受
std::string
?您是否尝试使用调试器运行它?在读取任何内容之前,您将未初始化的
recv\u buf
视为以空结尾的字符串。可能存在be其中的任何内容!在填充包含该内容的字符串之前,不应该格式化该字符串,然后它应该是
std::string(recv\u buf,nbytes\u recvd)
既然你没有显式地终止它,Hanks伙计们!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!而且,根本不需要
sockfd\u char
数组,你可以使用
sockfd\u string.size()和
sockfd\u string.c\u str()将
sockfd\u string
按原样传递给
发送给所有人()