📜  C++中的广泛char和库函数

📅  最后修改于: 2021-05-30 09:13:22             🧑  作者: Mango

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

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

下面是一个简单的C++实现,以显示如何使用wchar_t:

// An example C++ program to demonstrate use of wchar_t
#include 
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是宽字符字面量和宽字符字符串字面量的前缀,它告诉编译器该char或字符串的类型为wide-char。
  • 在操作宽字符类型时,w在扫描(wcin)或打印(wcout)之类的操作中带有前缀。

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

// An example C++ program to demonstrate use
// of wchar_t in array
#include 
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);
它返回宽字符串的长度。这相当于strlen的宽字符。

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

// An example C++ program to demonstrate use
// of wcslen()
#include 
#include
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 
#include
using namespace std;
  
int main()
{
    wchar_t waname[] = L"geeksforgeeks" ;
    wchar_t wacopy[14];
    wcscpy(wacopy, waname);
    wcout << L"Original = " << waname
          << L"\nCopy =  " << 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 
#include
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 
#include
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指向的以空值终止的宽字符串查找下一个标记。分隔字符由delim指向的以空终止的宽字符串标识。
str –指向以null终止的宽字符串以进行标记化的指针。
delim –指向以null终止的宽字符串标识分隔符的指针。
ptr –指向wchar_t *类型的对象的指针,wcstok使用该指针存储其内部状态。
这是strtok()的宽字符等效项。
下面是一个简单的C++实现,以显示wcstok的用法:

// An example C++ program to demonstrate use
// of wcstok()
#include 
#include
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 *目标,const wchar_t *源,size_t n);
将源的前n个宽字符复制到目标。如果在复制n个字符之前找到源宽度字符串的末尾,则将目标位置附加其他空宽度字符填充到总共n个字符为止。这与strncpy()的宽度字符等效。

下面是一个简单的C++实现,以显示wcsncpy的用法:

// An example C++ program to demonstrate use
// of wcsncpy()
#include 
#include
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'\0';   // 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++实现,以显示wcsstr的用法:

// An example C++ program to demonstrate use
// of wcsstr()
#include 
#include
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/

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”