标签: stdstring

C++:将std :: string传递给想要更改字符串的C函数的正确实现?

我在用C:编写的第三方库中有一个函数char* fix_filename_slashes(char* path).此函数需要传递给它的可变C字符串,以便它可以根据操作系统将路径中的所有斜杠更改为正确使用.我在Facade中使用的所有字符串都声明为std::strings.我试图简单地使用foo.c_str()所有其他函数,期望C字符串不会改变它并期望a const char *,但是这个函数会导致错误:Error: Argument of type "const char *" is incompatible with parameter of type "char *"

我得出的结果是:

char* tempf = const_cast<char*>(filename.c_str());
filename = std::string(fix_filename_slashes(tempf));
tempf = NULL;
Run Code Online (Sandbox Code Playgroud)

被认为是"正确"还是还有其他(更正确的?)方法来完成任务?

编辑

Whups.显然,该函数返回字符串的COPY.还有一些很好的答案已经给出了.

c++ char stdstring

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

如何在不制作副本的情况下将`std :: string`转换为`std :: vector <unsigned char>`?

我想调用一个库函数,其签名是:

bool WriteBinary(const std::vector<uint8_t> & DataToWrite);
Run Code Online (Sandbox Code Playgroud)

我有一个std::string变量,我想把它作为参数发送给它.

void WriteString(const std::string & TextData)
{
    // ...
    WriteBinary(TextData);  // <-- How to make this line work?
    // ...
}
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以直接发送std::string变量而无需复制它?

c++ casting stdstring stdvector

7
推荐指数
3
解决办法
1807
查看次数

在C++ 11中,将参考/指针返回到std :: string中的位置的最高性能是什么?

我正在构建一个文本解析器,std::string用作字符串的核心存储.

我知道这不是最优的,编译器内部的解析器使用优化方法.在我的项目中,我不介意失去一些性能以换取更清晰和更容易的维护.

一开始我在内存​​中读取了一个巨大的文本,然后我扫描每个字符以构建一组有序的标记,它是一个简单的词法分析器.目前我std::string用来表示令牌的文本,但我想通过使用引用/指针到原始文本来改进这一点.

根据我的阅读,返回并保持迭代器是一种不好的做法,引用std::string内部缓冲区也是一种不好的做法.

关于如何以"干净"的方式实现这一目标的任何建议?

c++ stdstring c++11

7
推荐指数
2
解决办法
736
查看次数

将非英语字符串存储在std :: string中

我有一个简单的字符串 std::wstring

std::wstring tempStr = _T("F:\\Projects\\Current_??_\\Cam.xml");
Run Code Online (Sandbox Code Playgroud)

我想把这个字符串存储在一个std::string.

我尝试了下面的代码,但结果与输入字符串不同

std::wstring tempStr = _T("F:\\Projects\\Current_??_\\Cam.xml");
//setup converter
typedef  std::codecvt_utf8_utf16 <wchar_t> convert_type;
std::wstring_convert<convert_type, wchar_t> converter;

//use converter (.to_bytes: wstr->str, .from_bytes: str->wstr)
std::string converted_str = converter.to_bytes( tempStr );
Run Code Online (Sandbox Code Playgroud)

输入字符串中存在的韩语字符串将转换为"ìžë™".

有什么办法可以在std :: string中获得相同的字符串吗?

预期结果:

converted_str应该包含F:\ Projects\Current_자동_\Cam.xml

下面是调试的屏幕截图,显示3个场景中的3个值(以3种方式转换).但它们都没有给出所需的价值.

调试图像

c++ string encoding stdstring wstring

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

有没有办法在不修改缓冲区内容的情况下设置std :: string的长度?

根据这些问题的答案中的陈述

..在C++ 11中应该可以调用一个C API函数,它接受一个char指针来存储输出,如下所示:

str::string str;
str.reserve(SOME_MAX_VALUE);
some_C_API_func(&str[0]);
Run Code Online (Sandbox Code Playgroud)

但是现在有一种合法的方法可以将字符串的大小设置为缓冲区内(空终止的)内容的长度吗?像这样的东西:

str.set_size(strlen(&str[0]));
Run Code Online (Sandbox Code Playgroud)

这是一个非常不美观的滥用,std::string无论如何我听到你说,但我不能char在堆栈上创建一个临时缓冲区,所以我必须在堆中创建一个缓冲区并在之后销毁它(我想避免).

有一个很好的方法来做到这一点?也许不是保留,但事后调整和调用erase()会做到但是它感觉不好整洁..

char stdstring c++11

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

从最多X个字符构造std :: string,停止在null char

我正在从文件中的结构中读取字符串,其中每个字符串具有固定长度,带有'\0'填充.如果存储的字符串需要整个长度,则它们不会以零终止.

我正在构建std::string像这样的人:

// char MyString[1000];
std::string stdmystring(MyString, ARRAYSIZE(MyString));
Run Code Online (Sandbox Code Playgroud)

但是,这也会复制填充.我现在可以修剪弦乐,但是有一种优雅而快速的方法来防止复制吗?

速度比空间更重要,因为它在一个循环中运行.

c++ stdstring c++03

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

如何让Visual Studio 2010警告未使用的变量?

#include <string>

using namespace std;

int main()
{
    string s; // no warning
    int i;    // warning C4101

    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  1. 为什么Visual Studio会警告我未使用的变量,i但s示例中没有?
  2. 我假设编译器不确定字符串构造函数的副作用.这是不显示警告的原因吗?
  3. 我能以某种方式启用有关未使用的字符串变量的警告?

我的警告级别设置为4.

c++ stdstring visual-studio-2010 compiler-warnings

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

如何从输出流创建std :: string?

原谅这个简单的问题,但我已经在这几个小时,但没有成功.我试图实现一个功能:

std::string make_date_string()
Run Code Online (Sandbox Code Playgroud)

我正在使用Howard Hinnant的日期库,它允许我做这样的事情:

cout << floor<days>(system_clock::now());
Run Code Online (Sandbox Code Playgroud)

打印像:

2017-07-09
Run Code Online (Sandbox Code Playgroud)

我试图找出如何将输出转换为std :: string,以便我可以从我的函数中返回它,但我无处可去.

c++ stdstring

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

C++ 中类似 Python 的字符串乘法

作为一名长期的 Python 程序员,我非常欣赏 Python 的字符串乘法功能,如下所示:

> print("=" * 5)  # =====
Run Code Online (Sandbox Code Playgroud)

因为*C++没有重载std::string,所以我设计了以下代码:

#include <iostream>
#include <string>


std::string operator*(std::string& s, std::string::size_type n)
{
  std::string result;

  result.resize(s.size() * n);

  for (std::string::size_type idx = 0; idx != n; ++idx) {
    result += s;
  }
  return result;
}


int main()
{
  std::string x {"X"};

  std::cout << x * 5; // XXXXX
}
Run Code Online (Sandbox Code Playgroud)

我的问题:这可以做得更惯用/更有效吗(或者我的代码甚至有缺陷)?

c++ stdstring c++11

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

C++:我如何创建一个接受连接字符串作为参数的函数?

我可以用某种方式设计我的日志记录功能,它使用C++接受以下形式的串联字符串吗?

int i = 1;
customLoggFunction("My Integer i = " << i << ".");
Run Code Online (Sandbox Code Playgroud)

.

customLoggFunction( [...] ){
    [...]
    std::cout << "Debug Message: " << myLoggMessage << std::endl << std::endl
}
Run Code Online (Sandbox Code Playgroud)

编辑:

使用std :: string作为函数的属性适用于连接字符串,但是传递的非连接字符串(如customLoggFunction("example string"))会产生编译时错误,表示该函数不适用于char [].当我以下列方式重载函数时...

customLoggFunction(std::string message){...}
customLoggFunction(char message[]){...}
Run Code Online (Sandbox Code Playgroud)

...连接的字符串抓住了工作.

我上传了代码:http://coliru.stacked-crooked.com/a/d64dc90add3e59ed

c++ cout stdstring

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