C++中的字符串类型

Tyrion2017 2013-08-06 09:33:22
最近敲代码的时候,发现有好多种字符串类型,它们之间的转化都被搞混了~~~求教一下:
LPCWSTR
LPCSTR
char*
string
wstring
wchar_t
L"···"
_T"···"

这几种类型,之间怎么转化,求指教。。。。
...全文
347 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
hongwenjun 2013-08-13
  • 打赏
  • 举报
回复
引用 6 楼 qq2262988 的回复:
	wstring wa = L"abc";

	const wchar_t* ch2 = wa.c_str();

	cout << ch2  << endl;
输出的结果为:00283BB2,这个有问题。如果:cout << *ch2 << endl;则输出第一个字符97.
	string a = "abc";

	const char* ch = a.c_str();

	cout << ch  << endl;
输出的结果为:abc,这个是正确的 怎么回事?


#include <iostream>
#include <string.h>

void Reverse(char* word)   // 适合C风格字符串反转函数
{
    // 来源 C++ Primer Plus 第五章 forstr2.cpp -- reversing an array
    char temp;
    size_t i, j;
    for (j = 0, i = strlen(word) - 1; j < i; --i, ++j) {
        temp = word[i];
        word[i] = word[j];
        word[j] = temp;
    }
}

void Reverse(wchar_t* word)   // 适合宽字节
{
    wchar_t temp;
    size_t i, j;
    for (j = 0, i = wcslen(word) - 1; j < i; --i, ++j) {
        temp = word[i];
        word[i] = word[j];
        word[j] = temp;
    }
}

int main()
{
    using namespace std;
    setlocale(LC_ALL, "");     // 用这句 GCC 和 VC编译器都支持输出宽字节

    char cs[] = "Who are you?";
    wchar_t ws[] = L"我是谁?";

    Reverse(cs);
    Reverse(ws);

    cout << cs << endl;
    wcout << ws << endl;

    return 0;
}

飞天御剑流 2013-08-06
  • 打赏
  • 举报
回复
引用 6 楼 qq2262988 的回复:
	wstring wa = L"abc";

	const wchar_t* ch2 = wa.c_str();

	cout << ch2  << endl;
输出的结果为:00283BB2,这个有问题。如果:cout << *ch2 << endl;则输出第一个字符97.
	string a = "abc";

	const char* ch = a.c_str();

	cout << ch  << endl;
输出的结果为:abc,这个是正确的 怎么回事?
宽字符输出要用wcout,在输出之前,要先std::wcout.imbue( std::locale( "chs" ) ); 那个语言字符串在LINUX中是zh_CN
飞天御剑流 2013-08-06
  • 打赏
  • 举报
回复
这些东西都是有规律的嘛: LP表示长指针,是win16时代的产物,现在把它视作P就行了; W表示宽字符; C表示const; STR表示指针; CHAR就是char; WCHAR就是wchar_t; _T是微软C库的,windows与其对应的是TEXT; 你记住这些就行了。
Tyrion2017 2013-08-06
  • 打赏
  • 举报
回复
	wstring wa = L"abc";

	const wchar_t* ch2 = wa.c_str();

	cout << ch2  << endl;
输出的结果为:00283BB2,这个有问题。如果:cout << *ch2 << endl;则输出第一个字符97.
	string a = "abc";

	const char* ch = a.c_str();

	cout << ch  << endl;
输出的结果为:abc,这个是正确的 怎么回事?
max_min_ 2013-08-06
  • 打赏
  • 举报
回复
windows 微软就是单疼的很 void * 不都解决了么?
hongwenjun 2013-08-06
  • 打赏
  • 举报
回复

L"宽字节字符串"   //  前缀 L 表示编译的时候""内的按宽字节解释
_T"自动单字节或者宽字节字符串" //   头文件里 使用  && 使用条件编译,能按你的项目属性(是否UNIcode码),自动 选择是否按 宽字节处理.
tchar // 参考_T,应该也是这样的
恨天低 2013-08-06
  • 打赏
  • 举报
回复
把那些宏都展开一下,记录下所有的类型,一个一个去查下。
hongwenjun 2013-08-06
  • 打赏
  • 举报
回复
typedef wchar_t WCHAR;
typedef CONST WCHAR *LPCWCH,*PCWCH,*LPCWSTR,*PCWSTR;

typedef char CHAR;
typedef CONST CHAR *LPCCH,*PCSTR,*LPCSTR;
可右键打开头文件定义查到如上。提供分析可以这样理解

const char*  == LPCSTR  // 指向C风格字符串的指针,C++ 如果指向常量字符串,会提示使用const 修饰 
const wchar_t* == LPCWSTR // 指向宽字节,其他同上行
string 和 wstring // 是C++的字符串类,单字节和宽字节之分, 使用 str.c_str() 转换成 const char*
 
Tyrion2017 2013-08-06
  • 打赏
  • 举报
回复
还有 const char* wchar tchar
ken_scott 2013-08-06
  • 打赏
  • 举报
回复
引用 8 楼 supermegaboy 的回复:
宽字符输出要用wcout,在输出之前,要先std::wcout.imbue( std::locale( "chs" ) ); 那个语言字符串在LINUX中是zh_CN
Mark

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧