C++ 在线程之间发送和读取字符串

C++ 在线程之间发送和读取字符串,c++,string,sockets,buffer,C++,String,Sockets,Buffer,这一直在折磨着我,而我缺乏c/c++方面的经验就是原因 我不知道如何从另一个线程中读入字符串。在这种情况下,线程来自连接到服务器线程的客户机。我能够毫无问题地通过ints。但是,似乎不知道如何传递字符串 从控制台读取字符串并需要发送到服务器的客户端: cout << "Enter in an operation and number: \n "; int x; char str[20]; int len = strlen(str); int result; cin>>

这一直在折磨着我,而我缺乏c/c++方面的经验就是原因

我不知道如何从另一个线程中读入字符串。在这种情况下,线程来自连接到服务器线程的客户机。我能够毫无问题地通过ints。但是,似乎不知道如何传递字符串

从控制台读取字符串并需要发送到服务器的客户端:

cout << "Enter in an operation and number: \n ";
int x;
char str[20];
int len = strlen(str);
int result;


cin>>str;
cin>>x;

write(client_sock, &len, sizeof(int));
write(client_sock, str, len);
write(client_sock, &x, sizeof(x));

read(client_sock, &result, sizeof(result));
cout<<result;
cout>str;
cin>>x;
写入(客户机_sock,&len,sizeof(int));
写入(客户端、短消息、长消息);
写入(客户机_sock,&x,sizeof(x));
读取(客户端存储和结果,大小(结果));

cout以null结尾的字符串是标准的c字符串。。。一系列字符,后跟空字节

作为一个普通的ascii字符串,“Hello”看起来像

0x48(H)
0x65(e)
0x6c(l)
0x6c(l)
0x6f(o)
0x00(空)

如您所见,您需要一个字符串长度+1字节的缓冲区(空终止符)

以下是一些指针

当你写和读的时候,你需要做同样的步骤

e、 g.首先在套接字上写入字符串的长度(字节数),我想在您的情况下,一个字节就足以描述长度,然后将字符串作为一系列字节写入。如果你希望有更大的字符串,使用一个数据类型来定义长度,而不是<代码> int >代码>,例如,做你自己的类型,记住,如果你在平台之间通信,你可能需要考虑。 到目前为止,您在书写方面所做的似乎还可以(我猜您遗漏了插座的开口/装订等):

在接收器端,首先读取长度,然后读取以下字节数:

read(client_sock, &len, sizeof(unsigned char));
char* buffer = new char[len + 1]; // create a buffer
read(client_sock, buffer, len);
buffer[len]='\0'; // terminate the string
现在缓冲区中有了字符串,只需将其转换为std::string

std::string s = buffer;
delete [] buffer; 
[免责声明:不打算为了显示原则而编写完整或可编译的代码]

这是不正确的说法:

char buf[sizeof(len)];
sscanf(buf, "%s", &str);
buf未初始化且太小,因为
sizeof(len)
将只返回
int
的大小,实际上是从未初始化的缓冲区读入一个有一个字节空间的字符串。这里不需要sscanf。

一些评论:

cout << "Enter in an operation and number: \n ";
int x;
char str[20];
int len = strlen(str);
int result;
同样,您已经分配了一个字符缓冲区,并立即将其未初始化地交给
sscanf(3)
<代码>sscanf(3)
将读取垃圾,它所做的任何事情都不可能是正确的


此外,您正在尝试将字符串存储到单个字节中(
charstr
)。您需要(a)将
char str
更改为
char*str
(b)实际为其分配一些内存。但是,也许strdup(3)函数会更有用,因为这看起来像是在复制字符串。

谢谢,但这对我几乎没有帮助。。我是否可以将缓冲区大小设置为buf[sizeof(len)+1]。。。len是读入的字符串的大小
char buf[sizeof(len)];
sscanf(buf, "%s", &str);
cout << "Enter in an operation and number: \n ";
int x;
char str[20];
int len = strlen(str);
int result;
char str;
/* ... */
char buf[sizeof(len)];
sscanf(buf, "%s", &str);