如何将std::stringa 转换为a char*或a const char*?
我没有太多使用C++的经验.相反,我在C#中工作得更多,所以,我想问一下我在那里会做些什么.我必须生成一个特定的字符串格式,我必须传递给另一个函数.在C#中,我可以通过以下简单代码轻松生成字符串.
string a = "test";
string b = "text.txt";
string c = "text1.txt";
String.Format("{0} {1} > {2}", a, b, c);
Run Code Online (Sandbox Code Playgroud)
通过生成这样一个上面的字符串,我应该能够通过它system().但是,system只接受char*
我在Win32 C++(不是C++/CLI),并且不能使用,boost因为它包含太多包含项目本身非常小的所有文件.喜欢的东西,sprintf()在我看来是有用的,但sprintf不接受string的a,b和c参数.有什么建议我如何生成这些格式化的字符串以传递给我的程序中的系统?
有没有办法获得"原始"缓冲区oa std :: string?
我在想类似的东西CString::GetBuffer().例如,使用CString我会这样做:
CString myPath;
::GetCurrentDirectory(MAX_PATH+1, myPath.GetBuffer(MAX_PATH));
myPath.ReleaseBuffer();
Run Code Online (Sandbox Code Playgroud)
那么,std :: string有类似的东西吗?
我应该在这个问题前面说我认为答案可能不是,但我想看看其他人对这个问题的看法.
我花了大部分时间编写与Win32 API交互的C++,就像大多数C风格API想要的那样:
这两种情况本质上都意味着如果你想std::string在你的代码中使用,你必须接受这样一个事实,即你每次std::string从临时缓冲区构造一个字符串时都会进行大量的字符串复制.
什么会很好:
std::string并预先保留其分配并提前设置其大小(以缓解方案1)std::string现有的char[](以缓解方案2)有没有一种很好的方法来做其中任何一种,或者我应该接受使用std::string旧学校API 的固有成本?看起来情况1看起来特别棘手,因为它std::string有一个短的字符串优化,因此它的缓冲区可以在堆栈或堆上,具体取决于它的大小.
我以前从未见过这个函数的调用char()。这是在哪里描述的,它是什么意思?此用法是此 cppreference.com 社区 wiki 页面上示例的一部分:https://en.cppreference.com/w/cpp/string/basic_string/resize:
short_string.resize( desired_length + 3 );
std::cout << "6. After: \"";
for (char c : short_string) {
std::cout << (c == char() ? '@' : c); // <=== HERE ===
}
Run Code Online (Sandbox Code Playgroud)
描述中的措辞对我来说也没有任何意义,我不明白它在说什么:
将附加字符初始化为
CharT().
在上下文中突出显示:
std::string::resize()方法的原因是尝试学习如何预先分配 astd::string以便在 C 函数调用中用作缓冲区char*。这可以通过首先std::string调用my_string.resize()函数来预分配 来实现。然后,您可以安全地&my_string[0]作为标准char*写入索引my_string.size() - 1。也可以看看:
我正在使用memcpy将特定数量的字符从char数组复制到char*.但是当我读到char*时,最终总是垃圾.
我正在使用libssh2 lib向我的raspberry pi发送命令并接收输出.
libssh2_channel_read将返回输出的字符数,int x输出文本将在char buffer[32].
我正在使用的代码:
char buffer[32];
int x = libssh2_channel_read(channel, buffer, sizeof(buffer));
char * output = (char *)malloc(sizeof(char)*x);
memcpy(output, buffer, x-2); // x - 2 because of "\r\n"
libssh2_channel_free(channel);
channel = NULL;
cout << output << endl;
Run Code Online (Sandbox Code Playgroud)
输出示例:
0??²²²²
Run Code Online (Sandbox Code Playgroud)
我只想要 0