【问题标题】:Confused about all the different string types and how to use them properly in Visual C++对所有不同的字符串类型以及如何在 Visual C++ 中正确使用它们感到困惑
【发布时间】:2012-01-16 03:33:56
【问题描述】:

几年前,我曾经用 C 进行一些基本的编程。现在我正在尝试重新学习我忘记的东西以及学习 Visual C++。我对所有字符串选项感到困惑,现在尝试使我的程序与 Unicode 兼容的额外层。我一直在阅读Beginning Visual C++ 2010 以及在线阅读以了解这些信息。

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

代码是:

#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 的语法是:

int WINAPI MessageBox(
  __in_opt  HWND hWnd,
  __in_opt  LPCTSTR lpText,
  __in_opt  LPCTSTR lpCaption,
  __in      UINT uType
);

另一方面,如果我只是使用命令行参数作为消息框的文本,我根本不需要转换字符串,我不知道为什么。

#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;
}

我的困惑是:

  1. 为什么我需要将 c_str() 用于 MessageBoxW 的参数 2,为什么我需要在参数 3 中使用 _T() 宏 (?)?

  2. 为什么程序在没有进行某种转换的情况下在第二个代码示例中运行?

  3. LPCTSTR 究竟是什么意思?我在 MSDN 函数中看到了另一个变体,称为 LPTSTR。

谢谢!

【问题讨论】:

  • 看看this
  • 谢谢!这确实很有帮助

标签: string visual-c++


【解决方案1】:
  1. MessageBoxW 函数需要一个 C 样式的宽字符串 (WCHAR )。宏 _L() 会更改您的字符串,使其与 Unicode 兼容(WCHAR 而不是 char*)。

  2. argv[] 不做对象,所以你已经从中得到了一个 WCHAR 指针。

  3. LPCTSTR 基本上是 const char * 或 const WCHAR* 的 WINAPI 类型定义,具体取决于您是否构建为 UNICODE。另请参阅此帖子:LPCSTR, LPCTSTR and LPTSTR

简而言之,您的主函数正在传递 WCHAR* 字符串,而 MessageBoxW 需要 WCHAR* 字符串。

【讨论】:

  • 但是通过创建一个wstring的变量,那已经是一个宽字符串了吗?为什么我需要使用 c_str() 函数?
【解决方案2】:

1) .c_str() 是一种将 C++ 字符串转换为 C 字符串的标准 C++ 方法。 _tmain、_T('x')、_T("text") 和 _TCHAR 是(有点难看的)Microsoft 宏,它们可以使您的程序以 unicode 或非 unicode 编译模式。项目选项中有一个全局设置,用于设置一些宏以将您的项目配置为这两种模式之一。

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

ma​​in, 'x', "text", char

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

wmain, L'x', L"text", wchar_t

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

【讨论】:

    猜你喜欢
    • 2019-03-31
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 2020-08-16
    • 1970-01-01
    • 2015-03-13
    • 2016-05-19
    相关资源
    最近更新 更多