String 混淆了所有不同的字符串类型,以及如何在Visual C++; 几年前,我曾经在C中做过一些基本的编程,现在我试图重新学习我所忘记的东西,同时学习Visual C++。我被所有的字符串选项和现在试图使我的程序与Unicode兼容的额外一层弄糊涂了。我已经开始阅读Visual C++ 2010以及在线阅读来学习这些信息。

String 混淆了所有不同的字符串类型,以及如何在Visual C++; 几年前,我曾经在C中做过一些基本的编程,现在我试图重新学习我所忘记的东西,同时学习Visual C++。我被所有的字符串选项和现在试图使我的程序与Unicode兼容的额外一层弄糊涂了。我已经开始阅读Visual C++ 2010以及在线阅读来学习这些信息。,string,visual-c++,String,Visual C++,作为练习,我正在编写一个非常基本的程序,要求用户输入一些文本,然后以messagebox的形式显示这些文本。这个程序可以运行,但我的工作方式更多的是通过猜测和查看其他示例,而不是真正理解为什么需要将各种字符串转换为不同的类型 代码是: #include "stdafx.h" #include <iostream> #include <string> #include "Windows.h" using std::wcin; using std::wcout; using

作为练习,我正在编写一个非常基本的程序,要求用户输入一些文本,然后以messagebox的形式显示这些文本。这个程序可以运行,但我的工作方式更多的是通过猜测和查看其他示例,而不是真正理解为什么需要将各种字符串转换为不同的类型

代码是:

#include "stdafx.h"
#include <iostream>
#include <string>
#include "Windows.h"

using std::wcin;
using std::wcout;
using std::wstring;

int _tmain(int argc, _TCHAR* argv[])
{
    wstring myInput;

    wcout << "Enter a string: ";

    getline(wcin, myInput);

    MessageBoxW(NULL, myInput.c_str(), _T("Test MessageBox"), 64);

    return 0;
}
另一方面,如果我只是使用命令行参数作为messagebox的文本,我根本不需要转换字符串,我也不知道为什么

#include "stdafx.h"
#include <iostream>
#include <string>
#include "Windows.h"

using std::wcout;

int _tmain(int argc, _TCHAR* argv[])
{

    MessageBoxW(NULL, argv[1], _T("Test MessageBox"), 64);

    return 0;
}
#包括“stdafx.h”
#包括
#包括
#包括“Windows.h”
使用std::wcout;
int _tmain(int argc,_TCHAR*argv[]
{
MessageBoxW(NULL,argv[1],_T(“测试MessageBox”),64);
返回0;
}
我的困惑是:

  • 为什么我需要对MessageBoxW的参数2使用c_str(),为什么我需要在参数3中使用_T()宏(?)

  • 为什么程序在第二个代码示例中工作而不进行某种转换

  • LPCTSTR到底是什么意思?我在MSDN函数中看到另一个变量,称为LPTSTR

  • 谢谢

  • MessageBoxW函数需要C样式的宽字符串(WCHAR)。宏_L()更改字符串,使其与Unicode兼容(WCHAR而不是char*)

  • argv[]不处理对象,因此您已经从中获得了一个WCHAR指针

  • LPCTSTR基本上是const char*或const WCHAR*的WINAPI typedef,具体取决于您是以UNICODE方式构建。另请参见本帖:

  • 简而言之,您的主函数被传递给WCHAR*字符串,MessageBoxW需要WCHAR*字符串

  • MessageBoxW函数需要C样式的宽字符串(WCHAR)。宏_L()更改字符串,使其与Unicode兼容(WCHAR而不是char*)

  • argv[]不处理对象,因此您已经从中获得了一个WCHAR指针

  • LPCTSTR基本上是const char*或const WCHAR*的WINAPI typedef,具体取决于您是以UNICODE方式构建。另请参见本帖:

  • 简短的是,你的主要功能是通过WCHAR *字符串,MasaGeBXW希望WCHAR *字符串。

    < P> <强> 1 > <强> > CyStRE()是一个强的>标准> /Stult> C++方法,将C++字符串转换为C字符串。strong>\u tmain、\u T('x')、\u T(“文本”)和_TCHAR是(有点难看)Microsoft宏,使您的程序以unicode或非unicode模式编译。“项目选项”中有一个全局设置,用于设置一些宏,以在这两种模式之一下配置项目

    如果处于非unicode模式(在MS文档中称为ANSI模式),宏将扩展为:

    main,'x','text',char

    如果处于unicode模式,宏将扩展为

    wmain,L'x',L“text”,wchar\u t

    2)3)Windows标题中充满了typedef和类似的宏。有时,它们会使代码变得更加晦涩难懂。一般来说,LP表示指针(我想是长指针,但我们需要区分近指针和远指针已经有一段时间了),C表示“常量”,T表示它将是char或wchar\T,具体取决于项目设置,STR显然是“字符串”。毕竟,这是一个普通的C型,这就是为什么你可以通过C字符串而不转换的方式。

    < P> <强> 1 > <强>。CyStRE()是一个强的>标准> /Stult> C++方法,将C++字符串转换为C字符串。strong>\u tmain、\u T('x')、\u T(“文本”)和_TCHAR是(有点难看)Microsoft宏,使您的程序以unicode或非unicode模式编译。“项目选项”中有一个全局设置,用于设置一些宏,以在这两种模式之一下配置项目

    如果处于非unicode模式(在MS文档中称为ANSI模式),宏将扩展为:

    main,'x','text',char

    如果处于unicode模式,宏将扩展为

    wmain,L'x',L“text”,wchar\u t


    2)3)Windows标题中充满了typedef和类似的宏。有时,它们会使代码变得更加晦涩难懂。一般来说,LP表示指针(我想是长指针,但我们需要区分近指针和远指针已经有一段时间了),C表示“常量”,T表示它将是char或wchar\T,具体取决于项目设置,STR显然是“字符串”。毕竟,它是一种普通的C类型,这就是为什么您可以将C字符串传递给它们而无需转换。

    请看一看,谢谢!那真是帮了大忙,看一看谢谢!这确实很有帮助,但是通过创建wstring变量,这已经是一个宽字符串了吗?那么为什么我需要使用c_str()函数呢?但是通过创建wstring变量,这已经是一个宽字符串了吗?那么为什么我需要使用c_str()函数呢?
    #include "stdafx.h"
    #include <iostream>
    #include <string>
    #include "Windows.h"
    
    using std::wcout;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
        MessageBoxW(NULL, argv[1], _T("Test MessageBox"), 64);
    
        return 0;
    }