我有一个 C++ 方法,它接受一个变量,方法签名如下:
DLL returnObject** getObject( const std::string folder = "" );
Run Code Online (Sandbox Code Playgroud)
我尝试传入:
const std::string myString = "something";
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
No matching function call to ... getObject( std::string&);
Run Code Online (Sandbox Code Playgroud)
我这里有几个问题。
std::string没有&folder = ""是吗?如果是这样,如何传递可选参数?我没有看到可以std::string消耗va_list. va_list是否有将 a 转换为 a 的通用解决方案std::string?
我见过以下形式的解决方案:
std::string vstring (const char * format, ...) {
std::string result;
va_list args;
va_start(args, format);
char buffer[1024];
vsnprintf(buffer, sizeof(buffer), format, args);
result = std::string(buffer);
va_end(args);
return result;
}
Run Code Online (Sandbox Code Playgroud)
这感觉容易出错并且很hacky。有没有办法直接std::string从 a 构建或操作va_list?
注意:上述解决方案的主要问题是需要猜测我需要的内存量。我不想浪费太多或没有足够的东西。理想情况下,我想要一种
std::string可以正常工作的样式不透明分配。注意:我需要一个不需要第三方库支持的解决方案。
我遇到了一些代码,其中包含以下示例的几个实例:
std::string str = "This is my string";
char* ptr = const_cast<char*>(str.c_str());
ptr[5] = 'w';
ptr[6] = 'a';
Run Code Online (Sandbox Code Playgroud)
在这个简化的例子中,有一个 的赋值std::string::c_str(),它返回const char*到一个char*使用的指针const_cast。
这似乎按预期工作并相应地str进行了修改。
但std::string::c_str()在我当地图书馆的描述如下:
返回指向空终止内容的常量指针。这是内部数据的句柄。不要修改,否则可能会发生可怕的事情。
在cppreference 中,描述包括:
返回一个指向空终止字符数组的指针,该数组的数据与存储在字符串中的数据等效。
...
写入通过访问的字符数组
c_str()是未定义的行为。
在标准的[string.accessors]的descritpion是类似的,没有关于这个信息......空终止字符数组与等同于存储在所述字符串中的数据被提供。
这不是澄清问题,而是让我更加困惑,什么字符数组?它是如何等效的?是副本吗?如果是这样,为什么要修改它,还要修改原始字符串?这个实现定义了吗?
我想避免更改使用它的所有代码实例的任务,所以我的问题是:
有什么办法可以是正确的,使用ptr指针修改str字符串是否合法?
有没有一种简单的方法可以将 std::string 转换为 std::vector 我想让用户输入任何长度的字符串,然后有一个动态字符数组(向量)。
#include<iostream>
#include<vector>
#include<string>
int main() {
std::vector<char> word;
std::string strWord;
std::getline(std::cin, strWord);
//What comes next?
}
Run Code Online (Sandbox Code Playgroud)
我尝试过但不起作用的一件事是:
strcpy(word, strWord);
我收到错误消息,没有从“std::string”到“const char*”的合适转换存在。因此,由于“word”是指向 char 数组的指针,我该如何添加字符串?
当一个空字符串被传递给 find 函数时,它返回 0。
如果传递了未初始化的字符串,那么它也返回 0。
#include <iostream>
#include <string>
using namespace std;
int main() {
string str1="";
string str2="This is a sample string";
unsigned int loc = str2.find(str1);
cout << "Loc : " << loc << endl;
if(loc != string::npos)
{
cout << "Found" << endl;
}
else
{
cout << "Not found" << endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:位置
:0
找到
我的问题是为什么 find 返回 0 而不是返回 string::npos ?
我有这个简单的例子:
#include <iostream>
#include <string>
int main(){
std::string str = "Hi there!";
std::cout << str << '\n';
//using std::string;
str.~string(); // error
}
Run Code Online (Sandbox Code Playgroud)
输出:
g++ main.cxx -std=c++2a -o prog
main.cxx: In function ‘int main()’:
main.cxx:10:15: error: expected class-name before ‘(’ token 10 | str.~string();
Run Code Online (Sandbox Code Playgroud)
如果我取消注释 main 中包含 using 声明的行,程序可以正常工作,但否则无法编译。
我收到了那个错误,所以我怎么能在std::string不通过 ausing declaration或 a暴露它的情况下调用析构函数using directive?谢谢!
尝试将 int 分配给字符串\n std::string s = 5;\n会产生以下编译器错误:
error: conversion from \xe2\x80\x98int\xe2\x80\x99 to non-scalar type \xe2\x80\x98std::string\xe2\x80\x99 {aka \xe2\x80\x98std::__cxx11::basic_string<char>\xe2\x80\x99} requested
但是,将 int 分配给映射中的字符串值则不然。例如,下面的代码可以编译,更糟糕的是使赋值将 int 转换为 char
\nmap <string, string>m;\nm["test"] = 5;\nRun Code Online (Sandbox Code Playgroud)\n这不应该是一个错误吗?
\n为了理解指针,我编写了下面的代码。
#include <cstdio>
#include <iostream>
using namespace std;
int main() {
string a = "hello";
const char *st = &a[0];
printf("%p\n", &st[0]);
printf("%p\n", &(a[0]));
printf("%c\n", *st);
printf("%p", &a);
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出
0x1265028
0x1265028
h
0x7ffe26a91c40
Run Code Online (Sandbox Code Playgroud)
如果我的理解是正确&a的应该返回字符串的地址,为什么返回的值与&a其余的不同?
我知道 std::string不是为继承而设计的,但是,我想知道为什么这个类定义不能编译:
\nusing std::string;\nclass ExtendedString: public string\n{\npublic:\n using string::string;\n ExtendedString left(size_type n) const {\n return substr(0, n>size()?size():n);\n }\n};\nRun Code Online (Sandbox Code Playgroud)\n我收到此错误:
\n../../src/capel-tool.cpp:21:17: error: could not convert \xe2\x80\x98std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::substr(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type, std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type) const [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int](0, ((n > ((const ExtendedString*)this)->ExtendedString::<anonymous>.std::__cxx11::basic_string<char>::size()) ? ((const ExtendedString*)this)->ExtendedString::<anonymous>.std::__cxx11::basic_string<char>::size() : n))\xe2\x80\x99 from \xe2\x80\x98std::__cxx11::basic_string<char>\xe2\x80\x99 to \xe2\x80\x98ExtendedString\xe2\x80\x99\nRun Code Online (Sandbox Code Playgroud)\n我预计left函数将使用 std::string 中的任何默认构造函数。
即使我添加一个像这样的显式构造函数:
\nusing std::string;\nclass ExtendedString: …Run Code Online (Sandbox Code Playgroud) 我试图让"CMtoaPlugin :: listArnoldNodes()"返回一个字符串的"数组"
std::vector<std::string> ArnoldNodes = CMtoaPlugin::listArnoldNodes();
std::vector<std::string>::iterator it;
for ( it=ArnoldNodes.begin() ; it < ArnoldNodes.end(); it++ )
{
printf("initialize shader %s\n", *it);
}
Run Code Online (Sandbox Code Playgroud)
但这是我得到的,2个条目,这是正确的,但条目的内容不是
初始化Arnold着色器†¡
初始化阿诺德着色器.
我究竟做错了什么
c++ ×10
stdstring ×10
stdvector ×2
c-str ×1
const-cast ×1
destructor ×1
inheritance ×1
iteration ×1
pointers ×1