如何将 SINGLE char 转换为系统字符串 C++?

Posted

技术标签:

【中文标题】如何将 SINGLE char 转换为系统字符串 C++?【英文标题】:How to convert a SINGLE char to system string C++? 【发布时间】:2020-09-07 14:18:33 【问题描述】:

我正在开发一个在控制台应用程序中显示以下字符/整数的程序。 我编写的代码在控制台应用程序中有效,但在表单中无效... 我还想在我的表单中显示这些值(textBox->text)。

我的 myfunctions.h 文件:


    typedef struct
    
        char Header         [23]; //the char I want to display is 23 characters long
        int  Version        [4];  //4 characters...
        char Projectname    [21];
        char Developer      [8];
        char email          [16];
        char Description    [132];
        char Unknown        [1]; 
    
    PackedContent;
    
    void BinaryReader()
    
    system("CLS");
    
    PackedContent t;
    
    fstream myFile;
    
    myFile.open("PackedContent.opf");
    
    if(!myFile)
    
    
        cout<<"An unknown error occured! Cannot read .opf file... exiting now... \n"<<endl;
        
    
    else
    
        cout    <<"Reading packed data content... done!\n"<<endl;
        
        myFile.read((char *)&t, sizeof(PackedContent));
    
    
        cout<<"\nHeader      :"         <<t.Header              <<endl; //  Header info [ok]
        
        //cout<<"\nVersion     :"           <<t.Version             <<endl; //  Project Version [err]
        
        cout<<"\nProject name:"         <<t.Projectname             <<endl; //  Project name
        
        cout<<"\nDeveloper name:"       <<t.Developer<<endl;
        cout<<"\nEmail       :"         <<t.email               <<endl; //  Developer email
        cout<<"\nDescription :"         <<t.Description         <<endl; //  Project description [ok]
        cout<<"Unknown"                 <<t.Unknown             <<endl;
    

表格:

Binary Reader.H (form)
PackedContent t;

BinaryReader();
textBox1->Text = t.Header; // doesnt work...

我也试过了:textBox1-&gt;Text = Convert::ToString(t.Header); //doesn't work...

【问题讨论】:

我认为你需要为 c++-cli 和/或 winforms 标记 char 数组作为字符串的问题是它们需要以空值终止。通常在普通的标准 C++ 中(您的表单代码很可能不是,它可能是托管的 C++/CLI)然后您可以从任意 un 终止的数组创建一个字符串作为std::string(t.Header, 23)。但是考虑到您的程序可能具有 C++/CLI 的性质,您可能需要找到一种特定于 C++/CLI 的方法来做同样的事情。 您的标题以及代码中的注释具有误导性,您没有“SINGLE char”,您有一个chararray。 “单个字符”将是单个 char,而不是数组。您可能在某些地方说“char” 的意思是 "string" 您忘记了终止零,这就是您遇到问题的原因。如果您要将字符串存储在长度为 23 的 c-array 中,您需要 char[24] 来包含尾随零。无论如何,使用这个 c 数组来存储文本是 C 风格的代码而不是 C++。 另外请提供minimal reproducible example并描述实际结果。 “不起作用”不是对问题的描述。 【参考方案1】:

如果您的 char 数组是空终止的,例如 C 字符串,您可以将它按原样传递给 std::string c'tor:

textBox1->Text = std::string(t.Header)

您的 char 数组不是以 null 结尾的,因此您还应该提供大小,如下所示:

int headerSize = 1; // This variable is just for the example. Instead you can pass the size right in the function below

textBox1->Text = std::string(t.Header, headerSize)

或者:

textBox1->Text = std::string(t.Header, std::size(t.Header))

【讨论】:

【参考方案2】:

您忘记了终止零,这就是您遇到问题的原因。

如果您要在长度为 23 的 c 数组中存储文本,则需要 char[24] (23 + 1) 来包含尾随零。

无论如何,使用这个 c 数组来存储文本是 C 风格的代码而不是 C++,应该避免这种情况。

如果您不包括终止零,则例如此调用extBox1-&gt;Text = t.Header; 将尝试找到它以执行到String 的转换。这将导致未定义的行为,结果字符串最后会包含一些垃圾,否则会以崩溃告终。

如果您的代码在此结构中记录以零结尾,但达到大小限制,那么您将遇到缓冲区溢出错误。

【讨论】:

有一个std::string c'tor 接受一个字符数组,后跟一个大小。这应该可以克服缺少空终止的问题。 如果没有minimal reproducible example,就很难分辨。请注意,当他在此结构中存储数据时,可能会导致缓冲区溢出错误。

以上是关于如何将 SINGLE char 转换为系统字符串 C++?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串数组转换为 Char * 数组 c++

使用 .NET 系统将字符数组转换为字符串? [复制]

如何将char*转换为wchar

如何将char数组转换为CString

如何将 RxSwift 的 Single 转换为 Observable 并忽略“完成”事件?

如何将char类型转换成int类型?