相关疑难解决方法(0)

string :: c_str()在C++ 11中不再以null结尾吗?

在C++中,11 basic_string::c_str被定义为完全相同basic_string::data,而后者又定义为*(begin() + n)*(&*begin() + n)(when 0 <= n < size())完全相同.

我找不到任何要求字符串在其末尾始终具有空字符的内容.

这是否意味着c_str()不再保证生成以null结尾的字符串?

c++ string c++11

72
推荐指数
3
解决办法
8440
查看次数

在C++ 11中,std :: string总是以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++ string null-terminated language-lawyer c++11

44
推荐指数
1
解决办法
7517
查看次数

为什么不string :: data()提供一个Mutable char*?

array,stringvector所有得到了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()会如此有用?

c++ string containers c-strings c++11

18
推荐指数
2
解决办法
4082
查看次数

在C++中通过UDP发送字符串

我想发送一个字符串:"Jane Doe"到Intranet ip 192.168.0.49000UDP 端口.我已经通过Java和UDP通过UDP和TCP完成了很多次,但是现在我必须使用标准的C++库来完成它,我找不到任何样本只有人们无法使其工作的主题.

我知道我必须编码"Jane Doe"为字节数组,然后只需打开套接字,将其打包在数据报中并发送.

C++不是我的第一语言,这是我无法弄清楚的代码的一小部分,我选择了UDP,因为它总是比TCP简单得多.

c++ sockets udp

15
推荐指数
3
解决办法
3万
查看次数

7
推荐指数
1
解决办法
7020
查看次数

将C++ 11 std :: string :: operator []返回以null结尾的缓冲区

我有一个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[].

有人可以引用标准吗?

c++ c++11

5
推荐指数
2
解决办法
498
查看次数

当使用字符串文字初始化时,std :: strings是否以'\ 0'结尾?

我知道字符串对象不是空终止但为什么这应该工作?

std::string S("Hey");
for(int i = 0; S[i] != '\0'; ++i)
   std::cout << S[i];
Run Code Online (Sandbox Code Playgroud)

所以构造函数也复制了null终止符,但是不增加长度?为什么这么麻烦?

c++ string null-terminated subscript-operator

5
推荐指数
2
解决办法
2427
查看次数

C++中'\0'的解释

#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什么不一样?

c++ string

4
推荐指数
1
解决办法
100
查看次数

C++字符串输入

我的书说如果我想读一个最大长度为40个字符的字符串,我必须声明一个长度为41的变量,但它没有说明原因.

char name[41];
cin >> name;
cout << name << endl;
Run Code Online (Sandbox Code Playgroud)

我知道这是一个新手问题,我确实是一个C++新手.

我希望你能帮助我.谢谢.

编辑:

感谢您的回答,我没想到在如此短的时间内获得如此多的好消息.

  1. 谁负责在char数组的末尾插入NULL终止符?

  2. 按Enter后"\n"会发生什么?

再次感谢.

c++

1
推荐指数
1
解决办法
1893
查看次数

C/C++:写入和读取套接字

我正在使用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一旦达到EOFSOCKET_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)

c c++ unix sockets

1
推荐指数
1
解决办法
301
查看次数

将空终止符附加到 C++ 字符串

为了实现某个协议的客户端需要对特定字符串进行空字节填充,我实现了一个用特定数量的空字节填充字符串的函数:

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++ 字符串也应该像处理任何其他字符一样处理空字节

如何实现所需的空填充?

c++ string protocols null-terminated

1
推荐指数
1
解决办法
1023
查看次数