C++ 在线程之间发送和读取字符串
这一直在折磨着我,而我缺乏c/c++方面的经验就是原因 我不知道如何从另一个线程中读入字符串。在这种情况下,线程来自连接到服务器线程的客户机。我能够毫无问题地通过ints。但是,似乎不知道如何传递字符串 从控制台读取字符串并需要发送到服务器的客户端: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>>
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);