我尝试了两种不同的方式将一个int附加到一个std::string ,令我惊讶的是,我得到了不同的结果: #include <string> int main() { std::string s; s += 2; // compiles correctly s = s + 2; // compiler error return 0; } 为什么在我使用+=运算符时编译和工作正常,但在使用+运算符时失败? 我不认为这个问题是如何连接一个std :: string和一个int? 在这个问题中,没有答案使用+=运算符。而std::string +=和+运算符之间的区别是解决我的疑问的关键。 坦率地说,这个问题是解释为什么c ++很难掌握的一个很好的例子。
在我的文件的顶部,我有 #define AGE "42" 在文件后面我多次使用ID,包括一些看起来像的行 1 std::string name = "Obama"; 2 std::string str = "Hello " + name + " you are " + AGE + " years old!"; 3 str += "Do you feel " + AGE + " years old?"; 我得到的错误: “错误:types'const char [35]'和'const char [2]'的无效操作数转换为二元运算符+'” 在线3.我做了一些研究,发现这是因为C ++如何处理不同的string,并能够通过将“年龄”更改为“string(AGE)”来修复它。 然而,我意外地错过了其中的一个例子,直到今天,我想知道为什么编译器不抱怨,即使我还有一个例子,只是“年龄”。 通过一些试验和错误,我发现我只需要string(AGE)的行,我不连接在函数体中创build的另一个string。 我的问题是“在后台发生了什么事情,C ++不喜欢将string与预处理程序放在其中的string连接起来,除非您还要连接在函数中定义的string。
std::string tmp; tmp +=0;//compile error:ambiguous overload for 'operator+=' (operand types are 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' and 'int') tmp +=1;//ok tmp += '\0';//ok…expected tmp +=INT_MAX;//ok tmp +=int(INT_MAX);//still ok…what? 第一个认为,传递整数作为参数,对不对? 为什么其他人通过编译?我在Visual C ++和g ++上testing,得到了上面的结果。 所以我相信我错过了标准定义的东西。 它是什么?
我正在使用std::string ,需要将它们填充到给定的宽度。 C ++中推荐的方法是什么? 示例input: 123 填充到10个字符。 示例输出: 123 (7个空格,123之前)
std::string my_string = ""; char test = my_string[0]; 我注意到,这不会崩溃,每次我testing它,testing是0。 我可以依靠它总是0吗? 或者是任意的? 这是不好的编程? 编辑:从一些评论,我收集到,这是有用的误解。 这样做的目的不是检查string是否为空。 这是不需要检查string是否为空。 情况是,有一个string可能会或可能不是空的。 我只关心这个string的第一个字符(如果它不是空的)。 在我看来,检查一下string是否为空是非常有效的,如果不是空的话,看第一个字符。 if (! my_string.empty()) test = my_string[0]; else test = 0; 相反,我可以只看第一个字符而不需要检查string是否为空。 test = my_string[0];
我正在寻找最优雅的方式来把一个stringvector插入到一个string中。 以下是我现在使用的解决scheme: static std::string& implode(const std::vector<std::string>& elems, char delim, std::string& s) { for (std::vector<std::string>::const_iterator ii = elems.begin(); ii != elems.end(); ++ii) { s += (*ii); if ( ii + 1 != elems.end() ) { s += delim; } } return s; } static std::string implode(const std::vector<std::string>& elems, char delim) { std::string s; return implode(elems, delim, […]
使用http://en.cppreference.com/w/cpp/string/basic_string_view作为参考,我看不出更优雅的做法: std::string s = "hello world!"; std::string_view v = s; v = v.substr(6, 5); // "world" 更糟糕的是,这种天真的做法是一个陷阱,并且暂时引用一个暂时的: std::string s = "hello world!"; std::string_view v(s.substr(6, 5)); // OOPS! 我似乎记得像标准库可能会添加一个子string作为视图: auto v(s.substr_view(6, 5)); 我可以想到以下解决方法: std::string_view(s).substr(6, 5); std::string_view(s.data()+6, 5); // or even "worse": std::string_view(s).remove_prefix(6).remove_suffix(1); 坦率地说,我认为这些都不是很好。 现在我能想到的最好的方法就是使用别名来简化事情。 using sv = std::string_view; sv(s).substr(6, 5);
以下C ++代码格式良好: void consumer(char const* p) { std::printf("%s", p); } std::string random_string_generator() { // returns a random std::string object } consumer(random_string_generator().c_str()); 我用它的问题是,创build临时std :: string对象并采取c_str()指针后,没有任何东西可以防止std :: string对象被破坏(或者我错了?)。 你可以请指点我的标准,如果代码是确定的,尽pipe一切。 它工作,当我用g ++testing。
有什么方法吗? 我的电脑是AMD64。 ::std::string str; BOOL loadU(const wchar_t* lpszPathName, int flag = 0); 当我使用: loadU(&str); VS2005编译器说: Error 7 error C2664:: cannot convert parameter 1 from 'std::string *__w64 ' to 'const wchar_t *' 我该怎么做?
使用C ++ 11,Ubuntu 14.04,GCC默认工具链 。 此代码失败: constexpr std::string constString = "constString"; 错误:constexprvariables'constString'的types'const string {aka const std :: basic_string}'不是文字…因为…'std :: basic_string'有一个非平凡的析构函数 可以在constexpr使用std::string吗? (显然不是…)如果是这样,怎么样? 在constexpr有没有其他的方法来使用string?