class mystring {
private:
string s;
public:
mystring(string ss) {
cout << "mystring : mystring() : " + s <<endl;
s = ss;
}
/*! mystring& operator=(const string ss) {
cout << "mystring : mystring& operator=(string) : " + s <<endl;
s = ss;
//! return this;
return (mystring&)this; // why COMPILE ERROR
} */
mystring operator=(const string ss) {
cout << "mystring : mystring operator=(string) : " + s <<endl;
s = ss;
return *this;
}
mystring operator=(const char …Run Code Online (Sandbox Code Playgroud) MEA CULPA:
好的,我错了.我找到了VarInfo :: m_datatypeName []的声明,它是VarInfo :: m_datatypeName [9].是的,硬编码.我向所有为我挠头的人道歉.
我收到此错误:
too many initializers for 'std::string[9]'
Run Code Online (Sandbox Code Playgroud)
对于这个声明:
std::string VarInfo::m_datatypeName[] = { "", "STRING", "TIME", "MACADDRESS", "IPADDRESS", "STRINGSET", "SET", "UINT32", "INT32", "BOOL" };
Run Code Online (Sandbox Code Playgroud)
新的消息:
注意:声明中没有9或10.如果分配列表中的项目不超过九个,则此功能正常.这是第10项是问题.
结束新的信息:
我有这个模糊的回忆,std :: string声明为一些默认的字符数预分配空间,所以我想怀疑字符串数组的类似行为.
所以,这是问题所在.我应该如何正确地宣布这个?希望不必硬声明m_datatypenames的大小?
虽然这可能是一个愚蠢的问题,但我看到了一些关于你不应该这样做的事情,尽管它在C++ 11中被允许,但我不明白为什么.谁能解释为什么会这样?
如何比较字符串中的单个字符和另一个字符串(可能大于或小于一个字符)
这个程序给了我近300行随机错误。错误也没有引用特定的行号,只是有关“ char *”,“”或“ std :: to_string”的很多东西。
#include <iostream>
#include <string>
using std::cout;
using std::string;
int main() {
string str = "MDCXIV";
string test = "D";
if (test == str[4]) { // This line causes the problems
cout << test << endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我有配置,我需要设置到某种容器我尝试设置为std :: vector但我在两种方式获得编译错误:
std::vector<std::string> ConfigVec= new std::vector<std::string>();
ConfigVec->at(0).append("00000\
11111\
00000");
ConfigVec->at(1) = "11111\
00000\
00000";
Run Code Online (Sandbox Code Playgroud)
没有很多std :: string声明,最简单的方法是什么
我可以看到std :: string只有一个CTOR initializer_list:string (initializer_list<char> il);所以初始化列表应该与chars一起使用,对吧?为什么std::string{"some_str"}有效,它得到了const char*,对吧?
c++ stdstring initialization-list uniform-initialization c++11
以下字符串的大小为4而不是我预期的3.
std::string s = "\r\n½";
int ss = s.size(); //ss is 4
Run Code Online (Sandbox Code Playgroud)
当循环通过字符串字符逐个字符转换为十六进制时我得到
0xc2来自哪里?它是某种编码信息吗?我虽然std :: string在字符串中每个可见字符都有一个字符.有人可以确认0xc2是"字符集修饰符"吗?
我收到了以字符串格式收到的JSON数据.
std::string jsonStr = GetJsonStringBuffer();
Run Code Online (Sandbox Code Playgroud)
//它可能会像这样存储在jsonStr中:
jsonStr = " {"Key1":"val1","key2":"val2","key3":"val3"} " ;
BUT JSON字符串本身有双引号(").所以当GetJsonStringBuffer()返回一个C++ std :: string存储时jsonStr.它不会产生问题,因为带有json数据的双引号(")可能被视为字符串分隔符C++ std :: string.
如何处理这种情况.我是否以编程方式为json字符串中的每个双引号添加"\"(反斜杠),我认为这不是一个很好的解决方案.有没有更好的C++解决方案呢?
我想知道什么是选择性地将_if字符从一个字符串复制到另一个字符串的最佳方法。我有类似的东西
string buffer1("SomeUnknownwSizeAtCompileTime");
string buffer2; // WillBeAtMostSameSizeAsBuffer1ButMaybeLessAfterWeRemoveSpaces
buffer2.resize(buffer1.length());
std::copy_if(buffer1.begin(), buffer1.end(), buffer2.begin(), [](char c){
//don't copy spaces
return c != ' ';
});
Run Code Online (Sandbox Code Playgroud)
buffer2可能比buffer1小很多,但是我们必须分配与buffer1的长度相同的内存量。但是,复制后,buffer2的结束迭代器将指向空终止符。我到处搜索,显然这是设计使然,所以现在我想知道我是否应该对字符串不使用copy_if?
谢谢
我喜欢了解赞成与反对者拥有和不拥有这样的演员。在包括Stack Overflow在内的多个地方,我可以看到const char*强制转换被认为是一个坏主意,但我不确定为什么吗?
编写通用例程和模板时,缺少(const char*)和强制始终使用强制转换c_str()会产生一些问题。
void CheckStr(const char* s)
{
}
int main()
{
std::string s = "Hello World!";
// all below will not compile with
// Error: No suitable conversion function from "std::string" to "const char *" exists!
//CheckStr(s);
//CheckStr((const char*)s);
// strlen(s);
// the only way that works
CheckStr(s.c_str());
size_t n = strlen(s.c_str());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
例如,如果我有大量接受const char*输入的文本处理功能,并且我希望std::string每次使用都能够使用c_str()。但是以这种方式std::string,const char*如果没有额外的努力,模板函数就不能同时使用。
作为一个问题,我可以看到一些运算符重载问题,但可以解决这些问题。
例如,正如[eerorika]指出的那样,通过允许隐式强制转换为指针,我们允许将非自愿的字符串类包含在布尔表达式中。但是我们可以通过删除bool运算符轻松解决此问题。更进一步,强制转换操作符必须明确:
class …Run Code Online (Sandbox Code Playgroud)