标签: stdstring

如何将 std::string 变量传递到函数中

我有一个 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)

我这里有几个问题。

  1. 我如何在std::string没有&
  2. 看起来这个值是可选的,folder = ""是吗?如果是这样,如何传递可选参数?

c++ stdstring

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

是否有一个与“vsnprintf”类似的函数可以与“std::string”一起使用

我没有看到可以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可以正常工作的样式不透明分配。

注意:我需要一个不需要第三方库支持的解决方案。

c++ variadic-functions stdstring

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

使用 std::string::c_str() 修改底层 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字符串是否合法?

c++ stdstring const-cast c-str

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

有没有办法在 C++ 中将 std::string 转换为 vector&lt;char&gt; ?

有没有一种简单的方法可以将 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 数组的指针,我该如何添加字符串?

c++ type-conversion stdstring stdvector

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

如果作为参数传递的字符串为空,则 C++ 中的字符串查找函数返回 0


当一个空字符串被传递给 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 ?

c++ stdstring

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

如何在不通过 using 声明公开字符串的情况下显式调用 std::string 析构函数?

我有这个简单的例子:

#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?谢谢!

c++ destructor stdstring

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

为什么将 int 分配给 std::map&lt;string,string&gt; 不会产生编译器错误

尝试将 int 分配给字符串\n std::string s = 5;\n会产生以下编译器错误:

\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

\n

但是,将 int 分配给映射中的字符串值则不然。例如,下面的代码可以编译,更糟糕的是使赋值将 int 转换为 char

\n
map <string, string>m;\nm["test"] = 5;\n
Run Code Online (Sandbox Code Playgroud)\n

这不应该是一个错误吗?

\n

c++ initialization stdstring variable-assignment

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

为什么地址不一样?

为了理解指针,我编写了下面的代码。

#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其余的不同?

c++ pointers stdstring memory-address

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

无法围绕 std::string 创建仅产生“语法糖”的包装器

我知道 std::string不是为继承而设计的,但是,我想知道为什么这个类定义不能编译:

\n
using 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};\n
Run 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\n
Run Code Online (Sandbox Code Playgroud)\n

我预计left函数将使用 std::string 中的任何默认构造函数。

\n

即使我添加一个像这样的显式构造函数:

\n
using std::string;\nclass ExtendedString: …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance stdstring

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

使用向量返回std :: string

我试图让"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++ iteration stdstring stdvector

0
推荐指数
2
解决办法
862
查看次数