C++中的宽字符和库函数

Wide char与char数据类型类似,不同之处在于Wide char占用的空间是char数据类型的两倍,因此可以占用更大的值。char可以接受256个值,对应于ASCII表中的条目。另一方面,宽字符可以接受65536个值,对应于UNICODE值。UNICODE值是最近的一个国际标准,允许对几乎所有语言和常用符号的字符进行编码。

null
  1. 就像字符常量的类型是char一样,宽字符的类型是wchar\u t。
  2. 此数据类型占用2或4个字节,具体取决于所使用的编译器。
  3. 在使用日语等国际语言时,通常使用wchar__t数据类型。

下面是一个简单的C++实现,展示了如何使用WHARGART:

// An example C++ program to demonstrate use of wchar_t
#include <iostream>
using namespace std;
int main()
{
wchar_t w  = L 'A' ;
cout << "Wide character value:: " << w << endl ;
cout << "Size of the wide char is:: " << sizeof (w);
return 0;
}


输出:

Wide character value:: 65
Size of the wide char is:: 4
  • L是宽字符文字和宽字符串文字的前缀,它告诉编译器该字符或字符串属于宽字符类型。
  • 在操作宽字符类型时,在扫描(wcin)或打印(wcout)等操作中,w是前缀。

宽字符类型数组或字符串: 就像char-type数组字符串一样,也可以有宽char-type数组字符串。下面是C++实现,以显示宽字符类型数组字符串:

// An example C++ program to demonstrate use
// of wchar_t in array
#include <iostream>
using namespace std;
int main()
{
// char type array string
char caname[] = "geeksforgeeks" ;
cout << caname << endl ;
// wide-char type array string
wchar_t waname[] = L "geeksforgeeks" ;
wcout << waname << endl;
return 0;
}


输出:

geeksforgeeks
geeksforgeeks

输出是相同的,但唯一的区别是宽字符数组使用两倍的内存来编码每个字符。

宽字符数组字符串的函数: 宽字符数组字符串的大多数函数都在头文件cwchar中定义。

wcslen(): 语法:size_t wcslen(const wchar_t*wcs); 它返回宽字符串的长度。这是斯特伦的宽字符等价物。

下面是一个简单的C++实现,展示如何获取宽字符数组字符串的长度。

// An example C++ program to demonstrate use
// of wcslen()
#include <iostream>
#include<cwchar>
using namespace std;
int main()
{
// wide-char type array string
wchar_t waname[] = L "geeksforgeeks" ;
wcout << L "The length of '" << waname
<< L "' is " << wcslen(waname) << endl;
return 0;
}


输出:

The length of 'geeksforgeeks' is 13

wcscpy(): 语法:wchar_t*wcscpy(wchar_t*strDestination,const wchar_t*strSource); wcscpy()代表宽字符串副本。它将strSource指向的宽字符串复制到strDestination指向的宽字符数组中。这是strcpy的宽字符等价物。 下面是一个简单的C++实现,展示了WCSCPY的使用:

// An example C++ program to demonstrate use
// of wcscpy()
#include <iostream>
#include<cwchar>
using namespace std;
int main()
{
wchar_t waname[] = L "geeksforgeeks" ;
wchar_t wacopy[14];
wcscpy(wacopy, waname);
wcout << L "Original = " << waname
<< L "Copy =  " << wacopy << endl;
return 0;
}


输出:

Original = geeksforgeeks
Copy =  geeksforgeeks

wcscat(): 语法:wchar_t*wcscat(wchar_t*strDestination,const wchar_t*strSource); wcscat()代表宽字符串连接。将strSource宽字符串的副本附加到strDestination宽字符串。这是strcat的宽字符等价物。

下面是一个简单的C++实现,展示了WCSCAT的使用:

// An example C++ program to demonstrate use
// of wcscat()
#include <iostream>
#include<cwchar>
using namespace std;
int main()
{
wchar_t string1[] = L "geeksforgeeks" ;
wchar_t string2[] = L " is for Geeks" ;
wcscat(string1, string2);
wcout << L "Concatenated wide string is = "
<< string1 << endl;
return 0;
}


输出:

Concatenated wide string is = geeksforgeeks is for Geeks

wcscmp(): 语法:int wcscmp(const wchar_t*wcs1,const wchar_t*wcs2); wcscmp()代表宽字符串比较。如果wcs1和wcs2相等,则返回0;如果不匹配的第一个宽字符在wcs1中的值大于在wcs2中的值,则返回大于零的值。如果不匹配的第一个宽字符在wcs1中的值小于wcs2中的值,则返回小于零的值。这是strcmp的宽字符等价物。

下面是一个简单的C++实现,展示了WCSCMP的使用:

// An example C++ program to demonstrate use
// of wcscmp()
#include <iostream>
#include<cwchar>
using namespace std;
int main()
{
wchar_t string1[] = L "geeksforgeeks" ;
wchar_t string2[] = L "GEEKS" ;
wcout << L "Comparison1 = "
<< wcscmp(string1, string2) << endl;
wcout << L "Comparison2 = "
<< wcscmp(string1, string1) << endl;
wcout << L "Comparison3 = "
<< wcscmp(string2, string1) << endl;
return 0;
}


输出:

Comparison1 = 1
Comparison2 = 0
Comparison3 = -1

wcstok(): 语法:wchar_t*wcstok(wchar_t*str,const wchar_t*delim,wchar_t**ptr); wcstok()代表宽字符串标记化。在str指向的以null结尾的宽字符串中查找下一个标记。分隔符由delim指向的以null结尾的宽字符串标识。 str–指向要标记化的以null结尾的宽字符串的指针。 delim–指向以null结尾的宽字符串标识分隔符的指针。 ptr–指向wchar_t*类型的对象的指针,wcstok使用该对象存储其内部状态。 这是strtok()的宽字符等价物。 下面是一个简单的C++实现,展示了WCSTOKE的使用:

// An example C++ program to demonstrate use
// of wcstok()
#include <iostream>
#include<cwchar>
using namespace std;
int main()
{
wchar_t string[] = L "geeksforgeeks,is,for,GEEKS" ;
wchar_t * internal_state;
wchar_t delim[] = L "," ;
wchar_t * token  = wcstok(string, delim, &internal_state);
while (token)
{
wcout << token << endl;
token = wcstok(NULL, delim, &internal_state);
}
return 0;
}


输出:

geeksforgeeks
is
for
GEEKS

wcsncpy(): 语法:wchar_t*wcsncpy(wchar_t*目的地,常量wchar_t*源,大小n); 将源的前n个宽字符复制到目标。如果在复制n个字符之前找到源范围字符串的结尾,则会使用其他空范围字符填充目标,直到总共n个字符。这是strncpy()的宽字符等价物。

下面是一个简单的C++实现,展示了WCSncPy的使用:

// An example C++ program to demonstrate use
// of wcsncpy()
#include <iostream>
#include<cwchar>
using namespace std;
int main()
{
wchar_t string1[] = L "Geeks For Geeks" ;
wchar_t string2[20];
wchar_t string3[20];
wcsncpy(string2, string1, 20);
// partial copy
wcsncpy(string3, string2, 5);
string3[5] = L ' ' ; // null character manually added
wcout << string1 << endl << string2
<< endl << string3 ;
return 0;
}


输出:

Geeks For Geeks
Geeks For Geeks
Geeks

wcsstr(): 语法:const wchar_t*wcsstr(const wchar_t*wcs1,const wchar_t*wcs2); 返回指向wcs1中第一个出现的wcs2的指针。如果wcs2不是wcs1的一部分,则返回空指针。这里,wcs1是要扫描的宽字符串,wcs2包含要匹配的序列。这是strstr()的宽字符等价物。

下面是一个简单的C++实现,展示了WCSRST:

// An example C++ program to demonstrate use
// of wcsstr()
#include <iostream>
#include<cwchar>
using namespace std;
int main()
{
wchar_t string1[] = L "Geeks Are Geeks" ;
wchar_t * string2 = wcsstr(string1, L "Are" );
wcsncpy(string2, L "For" , 3);
wcout << string1 << endl;
return 0;
}


输出:

Geeks For Geeks

参考: http://www.cplusplus.com/reference/cwchar/

本文由 马扎尔·伊玛目·汗 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 贡献极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。

如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享