我在用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.还有一些很好的答案已经给出了.
我想调用一个库函数,其签名是:
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变量而无需复制它?
我正在构建一个文本解析器,std::string用作字符串的核心存储.
我知道这不是最优的,编译器内部的解析器使用优化方法.在我的项目中,我不介意失去一些性能以换取更清晰和更容易的维护.
一开始我在内存中读取了一个巨大的文本,然后我扫描每个字符以构建一组有序的标记,它是一个简单的词法分析器.目前我std::string用来表示令牌的文本,但我想通过使用引用/指针到原始文本来改进这一点.
根据我的阅读,返回并保持迭代器是一种不好的做法,引用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++ 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()会做到但是它感觉不好整洁..
我正在从文件中的结构中读取字符串,其中每个字符串具有固定长度,带有'\0'填充.如果存储的字符串需要整个长度,则它们不会以零终止.
我正在构建std::string像这样的人:
// char MyString[1000];
std::string stdmystring(MyString, ARRAYSIZE(MyString));
Run Code Online (Sandbox Code Playgroud)
但是,这也会复制填充.我现在可以修剪弦乐,但是有一种优雅而快速的方法来防止复制吗?
速度比空间更重要,因为它在一个循环中运行.
#include <string>
using namespace std;
int main()
{
string s; // no warning
int i; // warning C4101
return 0;
}
Run Code Online (Sandbox Code Playgroud)
i但s示例中没有?我的警告级别设置为4.
原谅这个简单的问题,但我已经在这几个小时,但没有成功.我试图实现一个功能:
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,以便我可以从我的函数中返回它,但我无处可去.
作为一名长期的 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++接受以下形式的串联字符串吗?
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)
...连接的字符串抓住了工作.