标签: c-strings

如何从原始 C 字符串(CStr 或 *const u8)获取路径?

使用 C 字符串作为 Rust 字符串的最直接方法是什么Path

const char *从 FFI 获得并需要将其用作 Rust 中的文件系统路径。

  • 我不想在路径上强制使用 UTF-8,因此通过str/进行转换String是不可取的。
  • 它应该至少在 Windows 上适用于 ASCII 路径。

fopen澄清一下:我只是用 Rust stdlib 实现替换将路径传递给的现有 C 实现。对于给定的文件系统来说,无论它是有效路径还是正确编码,这都不是我的问题,只要它不比fopen(而且我知道fopen基本上在 Windows 上不起作用)更差。

c-strings ffi rust

12
推荐指数
2
解决办法
3123
查看次数

为什么在C++中使用std :: string而不是c风格的字符串?

"一个人应该总是使用std :: string而不是c风格的字符串(char *)"这是几乎所有在这里发布的源代码的建议.虽然建议无疑是好的,但正在解决的实际问题不允许详细阐述原因?建议的方面详细.这个问题是作为占位符.

一个好的答案应该包括以下几个方面(详细):

  1. 为什么要std::string在C++中使用c风格的字符串?
  2. 提到的做法有哪些缺点(如果有的话)#1
  3. 在提到的建议的反面#1是一个好的做法的情况是什么?

c++ string c-strings

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

使用C风格的字符串文字与构造未命名的std :: string对象的默认建议?

因此,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风格的字符串文字?


例1:

考虑以下:

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),但我可能是错的.


例2:

考虑以下:

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++ string c-strings stdstring string-literals

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

意外的 printf 输出

我刚刚发现 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数组也不够大,无法容纳所有数据。我真的要失去理智了。

c printf c-strings undefined-behavior output

11
推荐指数
2
解决办法
1224
查看次数

在C中,我可以在指针声明中初始化字符串,就像我可以在char数组声明中初始化字符串一样吗?

这两行代码是否实现了相同的结果?如果我在函数中有这些行,那么在两种情况下字符串都存储在堆栈中吗?除了不需要在第一行代码中声明空终止符之外,我是否应该使用一个而不是另一个?

char  s[] = "string";
char* s   = "string\0";
Run Code Online (Sandbox Code Playgroud)

c arrays pointers c-strings

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

NSString cString已弃用.有什么选择?

我有另一个新手问题.

我编写了一段代码,将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)

objective-c c-strings deprecated ios

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

比较两个char*是否相等

可能重复:
比较两个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)

尽管tempdata比赛,以下条件不工作:

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)

c++ c-strings

10
推荐指数
2
解决办法
5万
查看次数

在c ++/CLI中将c#中的String ^转换为CString

我需要帮助解决我在编写应用程序时遇到的问题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)

现在我想转换csPassCString.谁可以帮我这个事.先感谢您.

.net c# string mfc c-strings

10
推荐指数
2
解决办法
6526
查看次数

无论如何在Go中创建空终止字符串?

无论如何string在Go中创建null终止?

我目前正在尝试a:="golang\0"但它显示编译错误:

non-octal character in escape sequence: "
Run Code Online (Sandbox Code Playgroud)

string c-strings go

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

字符数组应如何用作字符串?

我知道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。

c string c-strings string-literals nul

10
推荐指数
2
解决办法
320
查看次数