Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String LPCSTR、TCHAR、字符串_String_Visual C++ - Fatal编程技术网

String LPCSTR、TCHAR、字符串

String LPCSTR、TCHAR、字符串,string,visual-c++,String,Visual C++,我正在使用下一种类型的字符串: LPCSTR、TCHAR、我要转换的字符串: 从TCHAR到LPCSTR 从字符串到字符 我通过以下代码将TCHAR转换为LPCSTR: RunPath = TEXT("C:\\1"); LPCSTR Path = (LPCSTR)RunPath; SaveFileDialog^ saveFileDialog1 = gcnew SaveFileDialog; saveFileDialog1->Title = "Сохранение файла-настро

我正在使用下一种类型的字符串: LPCSTR、TCHAR、我要转换的字符串:

  • 从TCHAR到LPCSTR
  • 从字符串到字符
  • 我通过以下代码将TCHAR转换为LPCSTR:

    RunPath = TEXT("C:\\1");
    LPCSTR Path = (LPCSTR)RunPath;
    
    SaveFileDialog^ saveFileDialog1 = gcnew SaveFileDialog;
    saveFileDialog1->Title = "Сохранение файла-настроек";
    saveFileDialog1->Filter = "bck files (*.bck)|*.bck";
    saveFileDialog1->RestoreDirectory = true;
    pin_ptr<const wchar_t> wch = TEXT("");
    if ( saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK ) {  
        wch = PtrToStringChars(saveFileDialog1->FileName);
    } else return;
    ofstream os(wch, ios::binary);
    
    从字符串到字符,我用该代码进行转换:

    RunPath = TEXT("C:\\1");
    LPCSTR Path = (LPCSTR)RunPath;
    
    SaveFileDialog^ saveFileDialog1 = gcnew SaveFileDialog;
    saveFileDialog1->Title = "Сохранение файла-настроек";
    saveFileDialog1->Filter = "bck files (*.bck)|*.bck";
    saveFileDialog1->RestoreDirectory = true;
    pin_ptr<const wchar_t> wch = TEXT("");
    if ( saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK ) {  
        wch = PtrToStringChars(saveFileDialog1->FileName);
    } else return;
    ofstream os(wch, ios::binary);
    
    SaveFileDialog^saveFileDialog1=gcnewsavefiledialog;
    saveFileDialog1->Title=“Сааааааа-аааааааа;
    saveFileDialog1->Filter=“bck文件(*.bck)|*.bck”;
    saveFileDialog1->RestoreDirectory=true;
    pin_ptr wch=文本(“”);
    如果(saveFileDialog1->ShowDialog()==System::Windows::Forms::DialogResult::OK){
    wch=PtrToStringChars(saveFileDialog1->FileName);
    }否则返回;
    流操作系统(wch,ios::binary);
    
    我的问题是,当我设置“配置属性->常规”时 字符集在“使用多字节字符集”的第一部分代码工作正常。但第二部分代码返回错误C2440。当我设置“配置属性->常规”时
    “使用Unicode”中的字符集代码的第二部分工作正常。但是代码的第一部分返回了从TCHAR到LPCSTR的唯一第一个字符。

    我建议您在整个过程中都需要使用Unicode

    LPCSTR是“指向C类型字符串的长指针”。在处理.Net方法时,这通常不是您想要的。Net中的字符类型为16位宽

    您也不应该使用TEXT(“”)宏,除非您计划使用各种字符编码进行多个构建。如果可以的话,尝试使用_W(“”)宏和纯unicode构建包装所有字符串文本

    看看这是否有帮助

    PS.在您的场景中非常方便

    编辑


    您只能看到一个字符,因为该字符串现在是unicode,但您将其转换为常规字符串。ASCII范围内的许多或大多数Unicode字符与ASCII中的数字相同,但其2个字节中的第二个字节设置为零。因此,当unicode字符串被读取为C字符串时,您只能看到第一个字符,因为C字符串以null(零)结尾。处理这个问题的简单(也是错误的)方法是使用std:wstring转换为std:string,然后从中拉出C-string。这不是安全的方法,因为Unicode有很大的字符空间,然后是你的标准编码。

    I代码在C++中使用.NET i要运行程序,使用WiExcel函数第一个参数,它是LPCSTR,在.NET中是否有一些类似的函数?您必须考虑到16位Unicode字符串可以表示一个不能表示为8位ASCII字符串的字符串。但是,如果您愿意冒险,您可以使用std::wstring构造函数创建一个wstring对象,然后将其转换为std::string,并在其中使用c_str()方法来获取LPCSTR。如果您在构建中启用了UNICODE,那么大多数Windows API都将
    \define
    -ed转换为宽字符版本。定义UNICODE时,T型(例如
    TCHAR
    LPCTSTR
    等)映射到
    wchar\u T
    const wchar\u T*
    。否则,它们将映射到
    char
    const char*
    。如果您确实是使用UNICODE编程,那么您可以使用类似于
    WCHAR
    LPCWSTR
    的东西,避免使用T型。