如何用C++输出字符串

如题所述

1. cout

场景1: 在源文件中定义 const char* str = "中文" 在 VC++ 编译器上,由于Windows环境用 GBK编码,所以字符串 "中文" 被保存为 GBK内码,
编译器也把 str 指向一个包含有 GBK编码的只读内存空间.
用 cout 输出 str 时, 由于中文Windows环境用GBK编码,所以把GBK编码的 str 内容输出到控制台,没问题.

场景2: 在Linux 下编辑一个文件 const char* str = "中文", 由于Linux普遍使用 UTF8 编码,所以在源文件里, "中文" 被保存为 UTF8内码.
然后在Windows中打开这个源文件,由于Windows使用GBK编码,所以VC++ 按照GBK去解释被保存为 UTF8 内码的 "中文", 显示为乱码.

2. wcout

在源文件中定义 const wchar_t* str = L"中文" 在 VC++ 编译器上,由于指定了L,所以字符串 "中文" 被保存为UNICODE内码(UCS2),编译器也把 str 指向一个包含有 UNICODE 编码的只读内存空间.
用 wcout 输出 str 时, wcout 首先调用 wcstomb_s() (即根据当前 local 转换, 如果没有设置local,则是经典的C local, 不认识中文)把 str 的内容转换后交给控制台,结果自然什么都不显示. (调试代码可以知道VC++ 2010 实现是一个字符一个字符输出,调用 wctomb_s)

原理
我们知道 cout 和 wcout 分别是 basic_ostream 的特化版本, 而 basic_ostream 调用 basic_streambuf 实际执行输出动作,针对 wchar_t,basic_streambuf有专门的特化函数,调用 fputwc 输出一个宽字符,而 fputwc 需要调用 wctomb_s 把宽字符转换后再输出. 我们知道wctomb_s 是依赖 locale 的,由于默认情况下是C locale,所以用中文内码调用 wctomb_s 会失败.

解决办法
设置当前系统的locale 替代默认的 "C" locale, 使 wctomb_s 等函数可以正常工作.
以下3种方法中的任意一种都可以达到目的.

1. C函数设置全局locale
setlocale(LC_ALL, "");

2. C++ 设置全局locale
std::locale::global(std::locale(""));

2. 单独为 wcout 设置一个 locale
std::locale loc("");
std::wcout.imbue(loc);

结论
和Windows API 不同 C++中的各种 w版本的类或者函数并不能提高性能,因为它们都需要用 wc..to..mb 之类的函数转换为ANSI兼容编码然后调用标准库函数.或者,如果库函数的实现者愿意,针对Windows系统,宽字符的fputwc可以直接调用UNICODE版本的Windows API而不用转换.但是这些都跟C++语言本身没有什么关系.由于Windows内核是UNICODE的,所以直接用 UNICODE 字符串调用 Windows API会有一点点好处.

C++设计者的出发点: 我不管你用什么字符编码,与C++无关,要输出时:如果是单字节字符或者多字节字符,直接输出;如果是宽字符,则根据local转换为多字节字符,然后再输出.
即使将来UNICODE过时了(假设,假设而已),也不要紧,只要定义好新的local即可.对于C语言也是这样.
Windows设计者的出发点: 统一使用 Unicode 宽字符,解决一切问题。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-11-27
char str[]="dsfdsf";
cout<<str<<endl;即可本回答被网友采纳
第2个回答  2011-11-27
直接用cout,它是一个智能输出流,可以识别要输出的数据类型!
第3个回答  2011-11-27
要加上#include <iostream>
string str="sklfjslkjf";
cout<<str<<endl;
第4个回答  2011-11-27
#include <iostream>
#include <string>

using namespace std;
int main()
{
string my_string = "So easy";
cout << my_string << flush;
return 0;
}

如何用C++输出字符串
所以直接用 UNICODE 字符串调用 Windows API会有一点点好处.C++设计者的出发点: 我不管你用什么字符编码,与C++无关,要输出时:如果是单字节字符或者多字节字符,直接输出;如果是宽字符,则根据local转换为多字节字符,然后再输出.即使将来UNICODE过时了(假设,假设而已),也不要紧,只要定义好新的local即可....

dev C++的字符串输出是怎么实现的?
1、首先我们新建一个dev C++的项目。2、接下来在项目中新建C语言程序文件。3、然后在C语言文件中声明一个字节数组。4、接下来我们通过printf函数提示用户输入字符串,通过scanf接收用户输入的字符串。5、接着在通过printf函数输出用户输入的内容。6、最后运行C语言程序,就可以知道内容,我们输入内容以后就...

c++怎么用cout输出字符串
如果你是用char定义了字符数组的话, 直接输出字符数组名就行了,如果你用的string类, 同样直接输出。代码如下:#include <iostream>#include <string>using namespace std;int main(){string s;char str[100];cin >> s;cin >> str;cout << s << endl;cout << str;return 0;} ...

c++怎么用cout输出字符串
1、“C++中cout”的常用于使用I\/O控制符。由于cout会对输出的内容进行缓冲,所以输出的内容并不会立即输出到目标设备而是被存储在缓冲区中,直到缓冲区填满才输出。2、cout是C++编程语言互换流中的标准输出流,需要iostream支持。读为cout。3、C++输入cout与输出cin输入和输出并不是C++语言中的正式组成成...

C++中的字符串输入输出函数详解
C++中的字符串输入输出函数详解:在程序设计中,cin、getline和getchar等函数对于处理字符串输入输出至关重要。首先,cin函数在处理空格和回车时有特殊行为。空格和回车会被忽略,但会保留在缓冲区,后续的get或getline会识别并处理。输入单个字符时,空格会被视为回车,而连续输入多个字符时,可以用空格或...

求编程大神:怎么设计c++程序使在键盘上输入任意一个字符串,输出该字符...
include <iostream>#include <string>using namespace std;int main(){char str[100];cout<<"输入一个字符串"<<endl;gets(str);int i=0,k=0;for(i=0;i<strlen(str);i++)if(str[i]!=' ')k++;cout<<"输入的字符有"<<k<<"个"<<endl;} ...

实例060 使用 C++字符串类 string 打印字符串
实例 060:C++字符串类 string 的打印操作在上一个实例中,我们了解了字符数组的输出方法。现在我们将转向C++字符串类 string,探讨如何打印其值。string 类提供了便利的成员函数重载,如运算符 "=",这使得我们能够像第 07 行所示那样轻松赋值。同样,string 类也支持运算符 "<",使其在比较和操作...

c++怎么用cout输出字符串
用cout输出字符串的参考数据如下:include <iostream>#include <iomanip>\/\/不要忘记包含此头文件using namespace std;int main(){ int a; cout<<"input a:";cin>>a; cout<<"dec:"<<dec<<a<<endl;\/\/以十进制形式输出整数cout<<"hex:"<<hex<<a<<endl;\/\/以十六进制形式输出整数a...

c++字符数组怎么整体输入输出
c++字符数组可以用以下的方法输入不含空格和TAB的字符串,以回车结束:char s[300];cin>>s;或:scanf("%s",s);可以用以下的方法输入可以包含空格和TAB的字符串,以回车结束:gets(s);可以用以下的方法整体输出一个字符串:printf("%s\\n",s);或:cout>>s>>endl;或:puts(s);

在c++中如何用cout输出整个字符数组
在c++中用cout输出整个字符数组:char*p="Hello,World!";cout<<p<<endl;\/\/输出Hello,World!cout<<*p<<endl;\/\/输出H cout<<(void*)p<<endl;cout<<';'<<endl;\/\/输出分号";"

相似回答