标签: stdstring

C++程序总是在执行std :: string赋值时崩溃

我一直在尝试调试崩溃的应用程序崩溃(即断言 *glibc检测到* free():无效指针:0x000000000070f0c0***)而我正在尝试对字符串进行简单的赋值.请注意,我正在使用gcc 4.2.4在Linux系统上进行编译,优化级别设置为-O2.使用-O0,应用程序不再崩溃.

例如

std::string abc;

abc = "testString";
Run Code Online (Sandbox Code Playgroud)

但如果我按如下方式更改了代码,它就不会再崩溃了

std::string abc("testString");
Run Code Online (Sandbox Code Playgroud)

所以我再次挠挠脑袋!但有趣的模式是,崩溃后来在应用程序中移动,AGAIN在另一个字符串.我发现应用程序在字符串赋值上不断崩溃是很奇怪的.典型的崩溃回溯看起来如下:

#0  0x00007f2c2663bfb5 in raise () from /lib64/libc.so.6
(gdb) bt
#0  0x00007f2c2663bfb5 in raise () from /lib64/libc.so.6
#1  0x00007f2c2663dbc3 in abort () from /lib64/libc.so.6
#2  0x00000000004d8cb7 in people_streamingserver_sighandler (signum=6) at src/peoplestreamingserver.cpp:487
#3  <signal handler called>
#4  0x00007f2c2663bfb5 in raise () from /lib64/libc.so.6
#5  0x00007f2c2663dbc3 in abort () from /lib64/libc.so.6
#6  0x00007f2c26680ce0 in ?? () from /lib64/libc.so.6
#7  0x00007f2c270ca7a0 in std::string::assign (this=0x7f2c21bc8d20, __str=<value optimized out>)
    at …
Run Code Online (Sandbox Code Playgroud)

c++ crash gdb valgrind stdstring

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

如何在标准C++字符串中使用3字节和4字节Unicode字符?

在标准C++中,我们有charwchar_t存储字符.char可以存储0x000xFF之间的值.并且wchar_t可以在0x0000和之间存储值0xFFFF.std::string使用char,因此它只能存储1个字节的字符.std::wstring使用wchar_t,因此它可以存储最多2个字节宽度的字符.这就是我对C++中字符串的了解.如果到目前为止我说错了,请纠正我.

我在维基百科上阅读了UTF-8的文章,我了解到一些Unicode字符占用的空间最多为4个字节.例如,汉字有一个Unicode代码点0x24B62,它占用内存中的3字节空间.

是否有一个STL字符串容器来处理这些字符?我正在寻找类似的东西std::string32.此外,我们有main()ASCII入口点,wmain()对于具有16位字符支持的入口点; 我们使用3和4字节Unicode支持的代码的入口点是什么?

你能加一个小例子吗?

(我的操作系统:Windows 7 x64)

c++ string stl stdstring unicode-string

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

如何调整Levenshtein Distance算法以限制单个单词的匹配?

我在C++中使用Levenshtein Distance算法比较两个字符串来衡量它们彼此之间的距离.然而,普通的Levenshtein距离算法不区分由空格界定的单词边界.这导致距离计算小于我想要的距离.我正在比较标题,看它们彼此有多接近,我希望算法不会将字符计算为匹配,如果它们来自多个单词.

例如,如果我比较这两个字符串,我会得到以下结果,+指定匹配并-指定不匹配:

Al Chertoff Et
Al Church Department of finance Et
+++++------+--++-----++-+------+++
Al Ch      e  rt     of f       Et
Run Code Online (Sandbox Code Playgroud)

我得到一个距离为20,在"Chertoff"四个单词中匹配单词,"Church Department of finance"而我真的希望它们被认为是彼此更远的,因为不允许字符与多个单词匹配并且与单词的距离为25 "Chertoff"大多数匹配一个单词"Department",三个字符匹配:

Al Chertoff Et
Al Church Department of finance Et
+++--------+--++---------------+++
Al         e  rt                Et
         Ch     off
Run Code Online (Sandbox Code Playgroud)

我怎样才能调整Levenshtein距离来实现这个目标,还是有另一种距离算法更适合这个?也许在每个单词上使用Levenshtein距离单独单词工作并选择距离最短的单词?但是,如果将一个单词深深地匹配到字符串中会导致后续单词匹配得不好,因为它们的匹配在字符串中最早?这可能以某种方式完成,Levenshtein距离适应于单词级别吗?

例如,对于以下更复杂的示例,这个想法的最短距离是20:

Al Chertoff Deport Et
Al Church Department of finance Et
+++++----++++-++---------------+++
Al Ch     Dep rt                Et
     ertoff  o
Run Code Online (Sandbox Code Playgroud)

而不是最大化"Chertoff"匹配并获得24的更长距离:

Al Chertoff Deport Et
Al …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm heuristics stdstring levenshtein-distance

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

如何将std :: string放入boost :: lockfree :: queue(或替代)?

我正在尝试将std::strings放入boost::lockfree::queues中,以便我的线程可以使用新数据相互更新.

当我尝试使用时boost::lockfree::queue<std::string> updated_data;,g++说:

在'class boost :: lockfree :: queue>'的实例化中:

错误:静态断言失败:(boost :: has_trivial_destructor :: value)

错误:静态断言失败:(boost :: has_trivial_assign :: value)

一般都会看到这些错误意味着什么,但我自己也没有希望自己解决这个问题,因为我几乎是c ++的新手.

有没有另一种方法在线程之间传递文本数据lockfree?如果不是,请告诉我如何把std::stringboost::lockfree::queue.

c++ queue boost stdstring lock-free

11
推荐指数
3
解决办法
8912
查看次数

为什么std :: string没有标准定义的文字后缀?

一个简单的问题:为什么C++ 11没有提供一个"用户 - "(真正的标准库)定义文字用于创建std::string,如

auto str = "hello world"s; // str is a std::string
Run Code Online (Sandbox Code Playgroud)

与C++一样,Objective-C支持C风格的字符串和更加用户友好的库类型NSString; 然而,与C++不同,没有人会在两者之间感到困惑,因为NSString通过为字符串文字添加前缀来创建一个很简单@.事实上,这是难得一见的Objective-C代码,其中一个文本具有的@前缀.每个人都知道这是做到这一点的方式,使用NSString和继续使用它.

C++ 11用户定义的文字将允许这样做,实际上Stroustrup的C++ 11 FAQ上的UDL部分恰好使用了这个例子.此外,没有前导下划线的UDL是保留的,因此在允许s如上所述的平原上没有问题- 它不可能与其他任何东西发生冲突.

也许我错过了一些东西,但似乎这对语言来说是一个非常有价值且无风险的补充,所以有人知道为什么C++ 11不能提供它吗?它可能出现在C++ 14中吗?

c++ stdstring user-defined-literals c++11 c++14

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

C++:关于空字符

有两个string变量,mn:

#include <string>

string m = "0100700\0"
cout << m.size() << endl; // it prints: 7

string n;
n += "0100700"
n += '\0';
cout << n.size() << endl; // it prints: 8
Run Code Online (Sandbox Code Playgroud)

我猜两个都有8个字符,但m只有7个字符,n有8个字符.为什么会这样?

c++ operators stdstring null-character double-quotes

11
推荐指数
2
解决办法
298
查看次数

固定大小字符串类的最佳实践

我想有一个固定大小的字符串类.理想情况下,接口将匹配std::string新接口永远不会分配新内存的一个区别.对于应该避免分配新内存的应用程序情况,它应该是一个方便的类.大小可以是静态的(在编译时已知).

我认为有两种方法.第一个是围绕char数组实现一个类,然后实现或多或少的所有函数std::string.我还必须实现一些运算符来创建std::string具有给定固定大小字符串的s等.

第二种方法,我甚至不确定是否可能,将继承std::string and覆盖可能改变字符串大小的所有函数.我查看了basic_stringVisual Studio中的标题,它似乎不是虚拟的,所以我想这不是要走的路.

您认为实施此类课程的最佳方法是什么?

c++ size fixed stdstring string-length

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

Why is b[2] false?

string s;
bool b[] = {s=="",  s==s.c_str(),  s.c_str()==""};
Run Code Online (Sandbox Code Playgroud)

sets

b[] = {true, true, false};
Run Code Online (Sandbox Code Playgroud)

why is b[2] false?

If A==B and A==C, should that not imply B==C?

c++ string stdstring string-literals equality-operator

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

为什么`std :: string`有一个`find`成员函数?

为什么std::string会有find会员功能而std::vector朋友却没有呢?

使用std::find字符串有什么问题吗?

c++ string stl stdstring

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

C++如何从std :: string中删除\ 0 char

\0从给定字符串中删除char 的正确方法是什么.

我没有成功:

std::string msg(data); // Data comes from a remote system connected via socket...
msg.erase(std::remove(msg.begin(), msg.end(), '\0'), msg.end());
Run Code Online (Sandbox Code Playgroud)

这给出了编译错误:

error: cannot convert ‘std::__cxx11::basic_string<char>::iterator {aka __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >}’ to ‘const char*’ for argument ‘1’ to ‘int remove(const char*)’
Run Code Online (Sandbox Code Playgroud)

data来自使用套接字的远程系统,并且/0由于源逻辑而在中间包含几段代码.

c++ stdstring

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