使用 C 字符串作为 Rust 字符串的最直接方法是什么Path?
我const char *从 FFI 获得并需要将其用作 Rust 中的文件系统路径。
str/进行转换String是不可取的。fopen澄清一下:我只是用 Rust stdlib 实现替换将路径传递给的现有 C 实现。对于给定的文件系统来说,无论它是有效路径还是正确编码,这都不是我的问题,只要它不比fopen(而且我知道fopen基本上在 Windows 上不起作用)更差。
"一个人应该总是使用std :: string而不是c风格的字符串(char *)"这是几乎所有在这里发布的源代码的建议.虽然建议无疑是好的,但正在解决的实际问题不允许详细阐述原因?建议的方面详细.这个问题是作为占位符.
一个好的答案应该包括以下几个方面(详细):
std::string在C++中使用c风格的字符串?#1?#1是一个好的做法的情况是什么?因此,C++ 14引入了许多用户定义的文字,其中一个是用于创建对象的"s"文字后缀std::string.根据文档,它的行为与构造std::string对象完全相同,如下所示:
auto str = "Hello World!"s; // RHS is equivalent to: std::string{ "Hello World!" }
Run Code Online (Sandbox Code Playgroud)
当然,构建一个未命名的std::string对象可以在C++ 14之前完成,但由于C++ 14的方式简单得多,我认为实际上会有更多的人考虑std::string在现场构建对象,这就是为什么我认为有必要提问这个.
所以我的问题很简单:在什么情况下构建一个未命名的std::string对象是一个好的(或坏的)想法,而不是简单地使用C风格的字符串文字?
考虑以下:
void foo(std::string arg);
foo("bar"); // option 1
foo("bar"s); // option 2
Run Code Online (Sandbox Code Playgroud)
如果我是正确的,第一个方法将调用适当的构造函数重载std::string来在foo范围内创建一个对象,第二个方法将首先构造一个未命名的字符串对象,然后foo从中移动构造的参数.虽然我确信编译器非常擅长优化这样的东西,但是,第二个版本似乎需要额外的移动,而不是第一个替代(当然不像移动是昂贵的).但同样,在使用合理的编译器编译之后,最终结果最有可能被高度优化,并且无论如何都没有冗余和移动/复制.
另外,如果foo被重载以接受右值引用怎么办?在那种情况下,我认为打电话是有意义的foo("bar"s),但我可能是错的.
考虑以下:
std::cout << "Hello World!" << std::endl; // option 1
std::cout << "Hello World!"s << std::endl; // option 2
Run Code Online (Sandbox Code Playgroud)
在这种情况下,std::string对象可能cout通过右值引用传递给运算符,第一个选项可能传递指针,因此两者都是非常便宜的操作,但第二个选项首先需要额外构建对象.这可能是一种更安全的方式(?). …
我刚刚发现 C 编译器有非常奇怪的行为。这是非常简单的代码。我在很多在线C编译器中尝试过,但结果总是一样的,这让我抓狂。
#include <stdio.h>
int main()
{
char Buffer[10] = "0123456789";
char ID[5] = "abcde";
printf("%s",ID);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
花点时间尝试预测函数的结果printf。如果你是像我一样的人,那么我认为最明显的解决方案是“abcde”,这是不正确的!但如果你以某种方式算出了“abcde0123456789”,那么你就在消耗电力来生活。
怎么、怎么可能?我只选择ID要打印的数组,那么为什么Buffer也用它打印呢?这没有道理。即使ID数组也不够大,无法容纳所有数据。我真的要失去理智了。
这两行代码是否实现了相同的结果?如果我在函数中有这些行,那么在两种情况下字符串都存储在堆栈中吗?除了不需要在第一行代码中声明空终止符之外,我是否应该使用一个而不是另一个?
char s[] = "string";
char* s = "string\0";
Run Code Online (Sandbox Code Playgroud) 我有另一个新手问题.
我编写了一段代码,将NSString转换为NSMutableData,以模拟webService结果.
但事实证明,不推荐使用cString.你能帮我换一下吗?这是我的代码.
NSString *testXMLDataString =
@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
etc....
"</SOAP-ENV:Envelope>";
//Replace webData Received from the web service with the test Data
NSMutableData *testXMLData = [NSMutableData dataWithBytes:[testXMLDataString cString] length:[testXMLDataString length]];
[webData setData:testXMLData];
Run Code Online (Sandbox Code Playgroud) 可能重复:
比较两个C风格字符串的正确功能是什么?
我的比赛条件不起作用!有人可以建议如何比较C风格的字符串?
void saveData(string line, char* data){
char *testString = new char[800];
char *stpr;
int i=0;
bool isData=false;
char *com = data;
strcpy(testString,line.c_str());
stpr = strtok(testString, ",");
while (stpr != NULL) {
string temp = stpr;
cout << temp << " ===== " << data << endl;
Run Code Online (Sandbox Code Playgroud)
尽管temp和data比赛,以下条件不工作:
if (stpr==data) {
isData = true;
}
Run Code Online (Sandbox Code Playgroud)
不确定这是否有帮助.该SaveData()函数从以下函数调用:
void readFile(char* str){
string c="", line, fileName="result.txt", data(str);
ifstream inFile;
inFile.open(fileName.c_str());
resultlist.clear();
if(inFile.good()){
while(!inFile.eof()){
getline(inFile, line);
if(line.find(data)!=string::npos){ …Run Code Online (Sandbox Code Playgroud) 我需要帮助解决我在编写应用程序时遇到的问题MFC.
我在我的应用程序中使用CLRie Common Language Runtime来集成c#API.但现在我坚持转换System::String^为CString.我无法做到这一点.
我正在使用以下代码.
String^ csPass = gcnew String(strPassword.GetBuffer());
array<Byte>^ Value = Encoding::UTF8->GetBytes(csPass);
for (int i = 0; i < Value->Length; i++ )
{
csPass += String::Format( "{0:X2}", Value[ i ] );
}
Run Code Online (Sandbox Code Playgroud)
现在我想转换csPass为CString.谁可以帮我这个事.先感谢您.
无论如何string在Go中创建null终止?
我目前正在尝试a:="golang\0"但它显示编译错误:
non-octal character in escape sequence: "
Run Code Online (Sandbox Code Playgroud) 我知道C中的字符串只是字符数组。因此,我尝试了以下代码,但给出了奇怪的结果,例如垃圾输出或程序崩溃:
#include <stdio.h>
int main (void)
{
char str [5] = "hello";
puts(str);
}
Run Code Online (Sandbox Code Playgroud)
为什么不起作用?
它可以用干净地编译gcc -std=c17 -pedantic-errors -Wall -Wextra。
注意:对于在声明字符串时未能为NUL终止符分配空间而引起的问题,本帖子旨在用作规范的FAQ。