相关疑难解决方法(0)

将nullptr传递给std :: string :: assign是否有效?

我有一个返回指针和长度的函数,我想调用std::string::assign(pointer, length).clear当长度为零且指针可能为nullptr时,是否必须进行特殊情况(调用)?

C++标准说:

21.4.6.3 basic_string::assign

basic_string& assign(const charT* s, size_type n);
Requires: s points to an array of at least n elements of charT.
Run Code Online (Sandbox Code Playgroud)

那么如果n是零呢?什么是零字符数组,如何指向它?打电话有效吗?

s.assign(nullptr, 0);
Run Code Online (Sandbox Code Playgroud)

还是未定义的行为?

s当大小n为零时,libstdc ++的实现似乎不会取消引用指针,但这几乎不是保证.

c++ c++-standard-library language-lawyer

21
推荐指数
4
解决办法
1857
查看次数

使用g ++避免使用NULL const char*进行不正确的std :: string初始化

有没有g ++选项可以用NULL const char*检测std :: string的不正确初始化?

我正在将一些int字段转换为std :: string,即:

struct Foo
{
   int id;
   Foo() : id(0) {} 
};
Run Code Online (Sandbox Code Playgroud)

...转换成:

struct Foo
{
   std::string id;
   Foo() : id(0) {} //oooops!
};
Run Code Online (Sandbox Code Playgroud)

我完全忽略了使用0和g ++初始化错误的'id'初始化时没有给我任何警告.在运行时检测到此错误(std :: string构造函数抛出异常),但我真的想在编译时检测到这些东西.有什么办法吗?

c++ g++ stdstring

10
推荐指数
2
解决办法
6022
查看次数

What(): basic_string::_M_construct null 无效

我正在制作一个程序,我需要使用一个将字符串的标记存储在向量中的函数。该功能无法正常工作,因此我在较小的程序上尝试了该功能。当然,我使用了字符串分词器函数。但它没有按预期工作。首先,这是代码:

#include <向量>
#include <字符串>
#include <cstring>
使用命名空间 std;

int main()
{
    矢量<字符串> v;
    字符串输入=“我的名字是阿曼库马尔”;
    
    char* ptr = strtok((char*)input.c_str(), " ");
    v.push_back((字符串)ptr);

    而(指针)
    {
        ptr = strtok(NULL," ");
        v.push_back((字符串)ptr);
    }
    cout<<"出来了";
    for(字符串 s:v)
    {
        cout<<s<<endl;
    }
}

现在问题来了。我认为这个问题与命令有关:

(string)ptr
Run Code Online (Sandbox Code Playgroud)

这个东西在第一次调用中工作得很好,但在 while 循环中出现时会出错。如果我将其注释掉并打印 ptr,那么它可以正常工作,但是程序会在 while 循环后终止,甚至不会执行

cout<<"coming out";
Run Code Online (Sandbox Code Playgroud)

不考虑向量的内容。但同样,如果我也不打印 ptr,则会打印存储在向量中的第一个令牌“My”。我确实找不到造成这种情况的原因。任何建议都会有帮助。

c++ string vector c-strings strtok

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

做m [0]时std :: map &lt;string,int&gt;崩溃

以下崩溃:

  std::map<std::string, int> m1{ {"0", 0}, { "1", 1 }};
  // auto melem = m1["0"]; // OK
  auto melem = m1[0];
Run Code Online (Sandbox Code Playgroud)

这是为什么?

c++ c++11

-6
推荐指数
1
解决办法
73
查看次数