在C++中,11 basic_string::c_str被定义为完全相同basic_string::data,而后者又定义为*(begin() + n)和*(&*begin() + n)(when 0 <= n < size())完全相同.
我找不到任何要求字符串在其末尾始终具有空字符的内容.
这是否意味着c_str()不再保证生成以null结尾的字符串?
在他的网站2008年的一篇文章中,Herb Sutter声明如下:
由于与并发相关的原因,有一个积极的建议是在C++ 0x中进一步加强这一点并且需要空终止并且可能禁止写时复制实现.以下是该文件:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2534.html.我认为本文中的一个或两个提案很可能会被采纳,但我们将在下一个或两个会议上看到.
我知道C++ 11现在保证std :: string内容连续存储,但他们是否在最终草案中采用了上述内容?
现在使用类似的东西会安全&str[0]吗?
在C++ 11 array,string和vector所有得到了data方法,该方法:
返回指向用作元素存储的基础数组的指针.指针是范围[
data();data() + size())即使容器为空,也始终是有效范围.[ 来源 ]
此方法const以所有适用容器的可变和版本提供,例如:
T* vector<T>::data();
const T* vector<T>::data() const;
Run Code Online (Sandbox Code Playgroud)
所有适用的容器,也就是除了string其只提供const版本:
const char* string::data() const;
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?为什么会被string贬低,何时char* string::data()会如此有用?
我想发送一个字符串:"Jane Doe"到Intranet ip 192.168.0.4到9000UDP 端口.我已经通过Java和UDP通过UDP和TCP完成了很多次,但是现在我必须使用标准的C++库来完成它,我找不到任何样本只有人们无法使其工作的主题.
我知道我必须编码"Jane Doe"为字节数组,然后只需打开套接字,将其打包在数据报中并发送.
C++不是我的第一语言,这是我无法弄清楚的代码的一小部分,我选择了UDP,因为它总是比TCP简单得多.
我有一个std::string类的对象,我需要传递给C函数,char*通过迭代它并搜索空终止符号来操作缓冲区.
所以,我有这样的事情:
// C function
void foo(char* buf);
// C++ code
std::string str("str");
foo(&str[0]);
Run Code Online (Sandbox Code Playgroud)
假设我们使用C++ 11,因此我们保证std::string表示将具有连续存储的字符.
但我想知道是否有任何保证&str[0]会指向缓冲区结束\0?是的,有c_str成员函数,但我在谈论operator[].
有人可以引用标准吗?
我知道字符串对象不是空终止但为什么这应该工作?
std::string S("Hey");
for(int i = 0; S[i] != '\0'; ++i)
std::cout << S[i];
Run Code Online (Sandbox Code Playgroud)
所以构造函数也复制了null终止符,但是不增加长度?为什么这么麻烦?
#include<iostream>
#include<string>
using namespace std;
int main(){
string i = "abc\0defg";
cout<<i<<endl;
// This prints "abc"
string x = "abcdefg";
x[3]='\0';
cout << x << endl;
// This prints "abcefg"
}
Run Code Online (Sandbox Code Playgroud)
我知道iC++ String 类的实例不会解释\0为字符串的结尾。为什么字符串i在\0?之后遗漏了所有内容?stringi和 和有x什么不一样?
我的书说如果我想读一个最大长度为40个字符的字符串,我必须声明一个长度为41的变量,但它没有说明原因.
char name[41];
cin >> name;
cout << name << endl;
Run Code Online (Sandbox Code Playgroud)
我知道这是一个新手问题,我确实是一个C++新手.
我希望你能帮助我.谢谢.
编辑:
感谢您的回答,我没想到在如此短的时间内获得如此多的好消息.
谁负责在char数组的末尾插入NULL终止符?
按Enter后"\n"会发生什么?
再次感谢.
我正在使用unix套接字发送和接收信息,但我不完全理解它是如何工作的.基本上,我发送这样的消息:
int wr_bytes = write(sock, msg.c_str(), msg.length());
Run Code Online (Sandbox Code Playgroud)
并收到这样的消息:
int rd_bytes = read(msgsock, buf, SOCKET_BUFFER_SIZE);
Run Code Online (Sandbox Code Playgroud)
这段代码与数千个字节完美配合,我不明白的是,read当其他部分完成发送消息时,函数如何知道?我试着阅读阅读文档,根据我的理解,read一旦达到EOF或SOCKET_BUFFER_SIZE正确,它将返回吗?
所以我猜测当我将我的字符串提供给write函数时,它会EOF在我的内容的末尾添加一个,以便read函数知道何时停止.
我问这个问题是因为,我没有添加任何代码来检查其他部分是否完成了发送消息,但是,我收到大消息(数千字节)没有任何问题,为什么会发生这种情况,为什么我没有得到消息的一部分?
这是我用来向unix套接字服务器发送消息的完整函数:
string sendSocketMessage(string msg) {
int sock;
struct sockaddr_un server;
char buf[1024];
sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (sock < 0) {
throw runtime_error("opening stream socket");
}
server.sun_family = AF_UNIX;
strcpy(server.sun_path, "socket");
if (connect(sock, (struct sockaddr *) &server, sizeof(struct sockaddr_un)) < 0) {
close(sock);
throw runtime_error("connecting stream …Run Code Online (Sandbox Code Playgroud) 为了实现某个协议的客户端需要对特定字符串进行空字节填充,我实现了一个用特定数量的空字节填充字符串的函数:
string padToFill(string s, int fill){
int len = s.length();
if (len < fill){
for (int i = 0; i < fill - len; i++){
s.append("\0");
}
}
return s;
}
Run Code Online (Sandbox Code Playgroud)
然而,实际上,我从这个函数得到的结果与我作为参数得到的字符串相同。例如padToFill("foo", 5)isfoo和 not foo\0\0。即使 C++ 字符串也应该像处理任何其他字符一样处理空字节。
如何实现所需的空填充?