一、字符串操作
- strcpy(p, p1) 復(fù)制字符串
- strncpy(p, p1, n) 復(fù)制指定長度字符串
- strcat(p, p1) 附加字符串
- strncat(p, p1, n) 附加指定長度字符串
- strlen(p) 取字符串長度
- strcmp(p, p1) 比較字符串
- strcasecmp忽略大小寫比較字符串
- strncmp(p, p1, n) 比較指定長度字符串
- strchr(p, c) 在字符串中查找指定字符
- strrchr(p, c) 在字符串中反向查找
- strstr(p, p1) 查找字符串
- strpbrk(p, p1) 以目標(biāo)字符串的所有字符作為集合,在當(dāng)前字符串查找該集合的任一元素
- strspn(p, p1) 以目標(biāo)字符串的所有字符作為集合,在當(dāng)前字符串查找不屬于該集合的任一元素的偏移
- strcspn(p, p1) 以目標(biāo)字符串的所有字符作為集合,在當(dāng)前字符串查找屬于該集合的任一元素的偏移
具有指定長度的字符串處理函數(shù)在已處理的字符串之后填補(bǔ)零結(jié)尾符
二、字符串到數(shù)值類型的轉(zhuǎn)換
- strtod(p, ppend) 從字符串 p 中轉(zhuǎn)換 double 類型數(shù)值,并將后續(xù)的字符串指針存儲到 ppend 指向的 char* 類型存儲。
- strtol(p, ppend, base) 從字符串 p 中轉(zhuǎn)換 long 類型整型數(shù)值,base 顯式設(shè)置轉(zhuǎn)換的整型進(jìn)制,設(shè)置為 0 以根據(jù)特定格式判斷所用進(jìn)制,0x, 0X 前綴以解釋為十六進(jìn)制格式整型,0 前綴以解釋為八進(jìn)制格式整型
- atoi(p) 字符串轉(zhuǎn)換到 int 整型
- atof(p) 字符串轉(zhuǎn)換到 double 符點(diǎn)數(shù)
- atol(p) 字符串轉(zhuǎn)換到 long 整型
三、字符檢查
- isalpha() 檢查是否為字母字符
- isupper() 檢查是否為大寫字母字符
- islower() 檢查是否為小寫字母字符
- isdigit() 檢查是否為數(shù)字
- isxdigit() 檢查是否為十六進(jìn)制數(shù)字表示的有效字符
- isspace() 檢查是否為空格類型字符
- iscntrl() 檢查是否為控制字符
- ispunct() 檢查是否為標(biāo)點(diǎn)符號
- isalnum() 檢查是否為字母和數(shù)字
- isprint() 檢查是否是可打印字符
- isgraph() 檢查是否是圖形字符,等效于 isalnum() | ispunct()
四、函數(shù)原型
-
原型:strcpy(char destination[], const char source[]);
功能:將字符串source拷貝到字符串destination中
例程:#include <iostream.h> #include <string.h> void main(void) { char str1[10] = { "TsinghuaOK"}; char str2[10] = { "Computer"}; cout <<strcpy(str1,str2)<<endl; }
運(yùn)行結(jié)果是:Computer
第二個字符串將覆蓋掉第一個字符串的所有內(nèi)容!
注意:在定義數(shù)組時,字符數(shù)組1的字符串長度必須大于或等于字符串2的字符串長度。不能用賦值語句將一個字符串常量或字符數(shù)組直接賦給一個字符數(shù)組。所有字符串處理函數(shù)都包含在頭文件string.h中。
- strncpy(char destination[], const char source[], int numchars);
原型:strncpy(char destination[], const char source[], int numchars);
功能:將字符串source中前numchars個字符拷貝到字符串destination中
例程:
#include <iostream.h>
#include <string.h>
void main(void)
{
char str1[10] = { "Tsinghua "};
char str2[10] = { "Computer"};
cout <<strncpy(str1,str2,3)<<endl;
}
運(yùn)行結(jié)果:Comnghua
注意:字符串source中前numchars個字符將覆蓋掉字符串destination中前numchars個字符!
- 原型:strcat(char target[], const char source[]);
功能:將字符串source接到字符串target的后面
例程:
include <iostream.h>
include <string.h>
void main(void)
{
char str1[] = { "Tsinghua "};
char str2[] = { "Computer"};
cout <<strcpy(str1,str2)<<endl;
}
運(yùn)行結(jié)果:Tsinghua Computer
注意:在定義字符數(shù)組1的長度時應(yīng)該考慮字符數(shù)組2的長度,因?yàn)檫B接后新字符串的長度為兩個字符串長度之和。進(jìn)行字符串連接后,字符串1的結(jié)尾符將自動被去掉,在結(jié)尾串末尾保留新字符串后面一個結(jié)尾符。
- 原型:strncat(char target[], const char source[], int numchars);
功能:將字符串source的前numchars個字符接到字符串target的后面
例程:
include <iostream.h>
include <string.h>
void main(void)
{
char str1[] = { "Tsinghua "};
char str2[] = { "Computer"};
cout <<strncat(str1,str2,3)<<endl;
}
運(yùn)行結(jié)果:Tsinghua Com
原型:int strcmp(const char firststring[], const char secondstring);
功能:比較兩個字符串firststring和secondstring
例程:
include <iostream.h>
include <string.h>
void main(void)
{
char buf1[] = "aaa";
char buf2[] = "bbb";
char buf3[] = "ccc";
int ptr;
ptr = strcmp(buf2,buf1);
if(ptr > 0)
cout <<"Buffer 2 is greater than buffer 1"<<endl;
else
cout <<"Buffer 2 is less than buffer 1"<<endl;
ptr = strcmp(buf2,buf3);
if(ptr > 0)
cout <<"Buffer 2 is greater than buffer 3"<<endl;
else
cout <<"Buffer 2 is less than buffer 3"<<endl;
}
運(yùn)行結(jié)果是:Buffer 2 is less than buffer 1
Buffer 2 is greater than buffer 3
原型:strlen( const char string[] );
功能:統(tǒng)計(jì)字符串string中字符的個數(shù)
例程:
include <iostream.h>
include <string.h>
void main(void)
{
char str[100];
cout <<"請輸入一個字符串:";
cin >>str;
cout <<"The length of the string is :"<<strlen(str)<<"個"<<endl;
}
運(yùn)行結(jié)果The length of the string is x (x為你輸入的字符總數(shù)字)
注意:strlen函數(shù)的功能是計(jì)算字符串的實(shí)際長度,不包括'\0'在內(nèi)。另外,strlen函數(shù)也可以直接測試字符串常量的長度,如:strlen("Welcome")。
void *memset(void *dest, int c, size_t count);
將dest前面count個字符置為字符c. 返回dest的值.
void *memmove(void *dest, const void *src, size_t count);
從src復(fù)制count字節(jié)的字符到dest. 如果src和dest出現(xiàn)重疊, 函數(shù)會自動處理. 返回dest的值.
void *memcpy(void *dest, const void *src, size_t count);
從src復(fù)制count字節(jié)的字符到dest. 與memmove功能一樣, 只是不能處理src和dest出現(xiàn)重疊. 返回dest的值.
void *memchr(const void *buf, int c, size_t count);
在buf前面count字節(jié)中查找首次出現(xiàn)字符c的位置. 找到了字符c或者已經(jīng)搜尋了count個字節(jié), 查找即停止. 操作成功則返回buf中首次出現(xiàn)c的位置指針, 否則返回NULL.
void *_memccpy(void *dest, const void *src, int c, size_t count);
從src復(fù)制0個或多個字節(jié)的字符到dest. 當(dāng)字符c被復(fù)制或者count個字符被復(fù)制時, 復(fù)制停止.
如果字符c被復(fù)制, 函數(shù)返回這個字符后面緊挨一個字符位置的指針. 否則返回NULL.
int memcmp(const void *buf1, const void *buf2, size_t count);
比較buf1和buf2前面count個字節(jié)大小.
返回值< 0, 表示buf1小于buf2;
返回值為0, 表示buf1等于buf2;
返回值> 0, 表示buf1大于buf2.
int memicmp(const void *buf1, const void *buf2, size_t count);
比較buf1和buf2前面count個字節(jié). 與memcmp不同的是, 它不區(qū)分大小寫.
返回值同上.
char *strrev(char *string);
將字符串string中的字符順序顛倒過來. NULL結(jié)束符位置不變. 返回調(diào)整后的字符串的指針.
char *_strupr(char *string);
將string中所有小寫字母替換成相應(yīng)的大寫字母, 其它字符保持不變. 返回調(diào)整后的字符串的指針.
char *_strlwr(char *string);
將string中所有大寫字母替換成相應(yīng)的小寫字母, 其它字符保持不變. 返回調(diào)整后的字符串的指針.
char *strchr(const char *string, int c);
查找字 串string中首次出現(xiàn)的位置, NULL結(jié)束符也包含在查找中. 返回一個指針, 指向字符c在字符串string中首次出現(xiàn)的位置, 如果沒有找到, 則返回NULL.
char *strrchr(const char *string, int c);
查找字符c在字符串string中最后一次出現(xiàn)的位置, 也就是對string進(jìn)行反序搜索, 包含NULL結(jié)束符.
返回一個指針, 指向字符c在字符串string中最后一次出現(xiàn)的位置, 如果沒有找到, 則返回NULL.
char *strstr(const char *string, const char *strSearch);
在字符串string中查找strSearch子串. 返回子串strSearch在string中首次出現(xiàn)位置的指針. 如果沒有找到子串strSearch, 則返回NULL. 如果子串strSearch為空串, 函數(shù)返回string值.
char *strdup(const char *strSource);
函數(shù)運(yùn)行中會自己調(diào)用malloc函數(shù)為復(fù)制strSource字符串分配存儲空間, 然后再將strSource復(fù)制到分配到的空間中. 注意要及時釋放這個分配的空間.
返回一個指針, 指向?yàn)閺?fù)制字符串分配的空間; 如果分配空間失敗, 則返回NULL值.
char *strcat(char *strDestination, const char *strSource);
將源串strSource添加到目標(biāo)串strDestination后面, 并在得到的新串后面加上NULL結(jié)束符. 源串strSource的字符會覆蓋目標(biāo)串strDestination后面的結(jié)束符NULL. 在字符串的復(fù)制或添加過程中沒有溢出檢查, 所以要保證目標(biāo)串空間足夠大. 不能處理源串與目標(biāo)串重疊的情況. 函數(shù)返回strDestination值.
char *strncat(char *strDestination, const char *strSource, size_t count);
將源串strSource開始的count個字符添加到目標(biāo)串strDest后. 源串strSource的字符會覆蓋目標(biāo)串strDestination后面的結(jié)束符NULL. 如果count大于源串長度, 則會用源串的長度值替換count值. 得到的新串后面會自動加上NULL結(jié)束符. 與strcat函數(shù)一樣, 本函數(shù)不能處理源串與目標(biāo)串重疊的情況. 函數(shù)返回strDestination值.
char *strcpy(char *strDestination, const char *strSource);
復(fù)制源串strSource到目標(biāo)串strDestination所指定的位置, 包含NULL結(jié)束符. 不能處理源串與目標(biāo)串重疊的情況.函數(shù)返回strDestination值.
char *strncpy(char *strDestination, const char *strSource, size_t count);
將源串strSource開始的count個字符復(fù)制到目標(biāo)串strDestination所指定的位置. 如果count值小于或等于strSource串的長度, 不會自動添加NULL結(jié)束符目標(biāo)串中, 而count大于strSource串的長度時, 則將strSource用NULL結(jié)束符填充補(bǔ)齊count個字符, 復(fù)制到目標(biāo)串中. 不能處理源串與目標(biāo)串重疊的情況.函數(shù)返回strDestination值.
char *strset(char *string, int c);
將string串的所有字符設(shè)置為字符c, 遇到NULL結(jié)束符停止. 函數(shù)返回內(nèi)容調(diào)整后的string指針.
char *strnset(char *string, int c, size_t count);
將string串開始count個字符設(shè)置為字符c, 如果count值大于string串的長度, 將用string的長度替換count值. 函數(shù)返回內(nèi)容調(diào)整后的string指針.
size_t strspn(const char *string, const char *strCharSet);
查找任何一個不包含在strCharSet串中的字符 (字符串結(jié)束符NULL除外) 在string串中首次出現(xiàn)的位置序號. 返回一個整數(shù)值, 指定在string中全部由characters中的字符組成的子串的長度. 如果string以一個不包含在strCharSet中的字符開頭, 函數(shù)將返回0值.
size_t strcspn(const char *string, const char *strCharSet);
查找strCharSet串中任何一個字符在string串中首次出現(xiàn)的位置序號, 包含字符串結(jié)束符NULL.
返回一個整數(shù)值, 指定在string中全部由非characters中的字符組成的子串的長度. 如果string以一個包含在strCharSet中的字符開頭, 函數(shù)將返回0值.
char *strspnp(const char *string, const char *strCharSet);
查找任何一個不包含在strCharSet串中的字符 (字符串結(jié)束符NULL除外) 在string串中首次出現(xiàn)的位置指針. 返回一個指針, 指向非strCharSet中的字符在string中首次出現(xiàn)的位置.
char *strpbrk(const char *string, const char *strCharSet);
查找strCharSet串中任何一個字符在string串中首次出現(xiàn)的位置, 不包含字符串結(jié)束符NULL.
返回一個指針, 指向strCharSet中任一字符在string中首次出現(xiàn)的位置. 如果兩個字符串參數(shù)不含相同字符, 則返回NULL值.
int strcmp(const char *string1, const char *string2);
比較字符串string1和string2大小.
返回值< 0, 表示string1小于string2;
返回值為0, 表示string1等于string2;
返回值> 0, 表示string1大于string2.
int stricmp(const char *string1, const char *string2);
比較字符串string1和string2大小,和strcmp不同, 比較的是它們的小寫字母版本.返回值與strcmp相同.
int strcmpi(const char *string1, const char *string2);
等價于stricmp函數(shù), 只是提供一個向后兼容的版本.
int strncmp(const char *string1, const char *string2, size_t count);
比較字符串string1和string2大小,只比較前面count個字符. 比較過程中, 任何一個字符串的長度小于count, 則count將被較短的字符串的長度取代. 此時如果兩串前面的字符都相等, 則較短的串要小.
返回值< 0, 表示string1的子串小于string2的子串;
返回值為0, 表示string1的子串等于string2的子串;
返回值> 0, 表示string1的子串大于string2的子串.
int strnicmp(const char *string1, const char *string2, size_t count);
比較字符串string1和string2大小,只比較前面count個字符. 與strncmp不同的是, 比較的是它們的小寫字母版本. 返回值與strncmp相同.
char *strtok(char *strToken, const char *strDelimit);
在strToken 串中查找下一個標(biāo)記, strDelimit字符集則指定了在當(dāng)前查找調(diào)用中可能遇到的分界符. 返回一個指針, 指向在strToken中找到的下一個標(biāo)記. 如果找不到標(biāo)記, 就返回NULL值. 每次調(diào)用都會修改strToken內(nèi)容, 用NULL字符替換遇到的每個分界符.
c++概念字符串操作
一、char_traits 字符特征類
1)意義:包裝特定串元素的通用行為界面,以便容器實(shí)現(xiàn)時依據(jù)特征信息而執(zhí)行特定行為
2)定義了通用類型名
typedef _Elem char_type;
typedef int int_type;
typedef streampos pos_type;
typedef streamoff off_type;
typedef mbstate_t state_type;
其中 int_type 表示字符元素轉(zhuǎn)換到特定編碼時的整型表示,pos_type, off_type 分別作為字符串索引和字符串元素偏移的類型,類似容器迭中的指針,迭代類型和指針,迭代器的偏移類型。最后的 state_type 用于存儲流狀態(tài),如出錯,格式控制等等。
3)定義了字符 / 字符串操作的包裝界面,以便通用算法的調(diào)用
assign(a, b) 定義將 b 字符賦值給 a 字符的過程,實(shí)現(xiàn) a.operator = 的行為
eq(a, b) 定義 a 字符和 b 字符的相等關(guān)系,實(shí)現(xiàn) a.operator == 的行為
lt(a, b) 定義 a 小于 b 的關(guān)系,實(shí)現(xiàn) a.operator < 的行為
compare(a_ptr, b_ptr, cnt) 定義兩組字符串的比較,返回 int 類型,實(shí)現(xiàn)類似 memcmp 的行為
length(ptr) 定義取字符串長度,實(shí)現(xiàn)類似 strlen 的行為
copy(a_ptr, b_ptr, cnt) 定義兩組字符串的復(fù)制,實(shí)現(xiàn)類似 memcpy 的行為
move(a_ptr, b_ptr, cnt) 定義兩組字符串的不重疊復(fù)制,實(shí)現(xiàn)類似 memmove 的行為
assign(ptr, cnt, ch) 定義了填充字符串的過程,實(shí)現(xiàn)類似 memset 的行為
to_int_type(ch) 定義了 char_type 到 int_type 整型的轉(zhuǎn)換過程
to_char_type(n) 定義了 int_type 到 char_type 字符型的轉(zhuǎn)換過程
eq_int_type(a, b) 定義兩個和當(dāng)前 char_type 類型對應(yīng)的 int_type 的相等關(guān)系
eof() 定義字符串結(jié)尾符,使用整型表示
not_eof(n) 定義非字符串結(jié)尾符,若輸入結(jié)尾符,則返回 1,其他輸入返回原值,即總是不返回 eof()
4)int_type 類型應(yīng)是當(dāng)前字符類型的整型編碼
二、std::string 并不是序列容器,沒有 front() 和 back() 界面用于取出前端和尾端的元素,使用 std::string::operator [] 并傳遞 streampos 類型取得特定元素,如 std::string::size() - 1 作為索引取得最后一個字符
三、basic_string 支持的初始化
1)默認(rèn)初始化
2)分配器
3)復(fù)制構(gòu)造
4)局部復(fù)制 [_Roff, _Roff + _Count)
5)局部復(fù)制 + 分配器
6)C 字符串 [_Ptr, <null>)
7)C 字符串 + _Count [_Ptr, _Ptr + _Count)
8)C 字符串 + 分配器
9)C 字符串 + _Count + 分配器 [_Ptr, _Ptr + _Count)
10)_Count * _Ch
11)_Count * _Ch + 分配器
12)迭代器 [_ItF, _ItL)
13)迭代器 + 分配器
字符到串不能初始化,但支持 operator = 賦值和 operator += 累加賦值運(yùn)算。
四、字符串的區(qū)間有效性
對串的索引訪問在超過字符串的有效區(qū)間時,因?yàn)榇脑趯?shí)現(xiàn)上對內(nèi)置的字符緩沖區(qū)執(zhí)行下標(biāo)訪問,所以不會導(dǎo)致異常,但是將得到不可預(yù)知的結(jié)果,通常是不可用的。
將其他字符串作為右值輸入時,對該串取出計(jì)數(shù)大于串大小時按串大小計(jì)算。
std::basic_string::size_type 的實(shí)際類型為 size_t,在 Visual C++ 7.1 中實(shí)現(xiàn)為 unsigned,std::basic_string::npos 被靜態(tài)設(shè)定為
(basic_string<_Elem, _Traits, _Alloc>::size_type)(-1);
在查找子字符串等操作時,函數(shù)返回 npos 的值表示非法索引。
五、比較字符串
允許的比較對象
1)compare(s2) 其他同類型字符串
2)compare(p) C 風(fēng)格字符串
3)compare(off, cnt, s2) [off, off + cnt) 同 s2 執(zhí)行比較
4)compare(off, cnt, s2, off2, cnt2) [off, off + cnt) 同 s2 [off2, cnt2) 執(zhí)行比較
5)compare(off, cnt, p) [off, off + cnt) 同 [p , <null>) 執(zhí)行比較
6)compare(off, cnt, p, cnt2) [off, off + cnt) 同 [p, p + cnt2) 執(zhí)行比較
返回 -1, 0, 1 作為小于、等于和大于的比較結(jié)果。
六、附加數(shù)據(jù)
1)使用 operator += 接受其他字符串,C 風(fēng)格字符串和字符
2)使用 push_back() 在尾部附加字符,并使得通過字符串構(gòu)造的 back_iterator 可以訪問
3)append() 附加
1、append(s) 追加字符串
2、append(s, off, cnt) 追加字符串 s [off, off + cnt)
3、append(p) 追加字符串 [p, <null>)
4、append(p, cnt) 追加字符串 [p, p + cnt)
5、append(n, c) 填充 n * c
6、append(InF, InL) 追加輸入流 [InF, InL)
4)insert() 插入
1、insert(off, s2) 插入字符串
2、insert(off, s2, off2, cnt2) 插入字符串 s [off2, off2 + cnt2)
3、insert(off, p) 插入字符串 [p, <null>)
4、insert(off, p, cnt) 插入字符串 [p, p + cnt)
5、insert(off, n, c) 插入 n * c
6、insert(iter) 元素默認(rèn)值填充
7、insert(iter, c) 插入特定元素
8、insert(iter, n, c) 插入 n*c
9、insert(iter, InF, InL) 插入 [InF, InL)
5)operator +(a, b)
字符串關(guān)聯(lián)運(yùn)算符重載中支持 operator + 的形式
1、s + s
2、s + p
3、s + c
4、p + s
5、c + s
七、查找、替換和清除
1)find() 查找
1、find(c, off) 在 s [off, npos) 中查找 c
2、find(p, off, n) 在 s [off, npos) 中查找 [p, p + n)
3、find(p, off) 在 s [off, npos) 中查找 [p, <null>)
4、find(s2, off) 在 s [off, npos) 中查找 s2
2)find() 的變種
1、rfind() 具有 find() 的輸入形式,反序查找
2、find_first_of() 具有 find() 的輸入形式,返回第一個匹配的索引
3、find_last_of() 具有 find() 的輸入形式,返回倒數(shù)第一個匹配的索引
4、find_first_not_of() 具有 find() 的輸入形式,返回第一個不匹配的索引
5、find_last_not_of() 具有 find() 的輸入形式,返回倒數(shù)第一個不匹配的索引
3)replace() 替換
1、replace(off, cnt, s2) 將 s [off, off + cnt) 替換成 s2
2、replace(off, cnt, s2, off2, cnt2) 將 s [off, off + cnt) 替換成 s2 [off2, off2 + cnt2)
3、replace(off, cnt, p) 將 s [off, off + cnt) 替換成 [p, <null>)
4、replace(off, cnt, p, cnt2) 將 s [off, off + cnt) 替換成 [p, p + cnt2)
5、replace(off, cnt, n, c) 將 s [off, off + cnt) 替換成 c * n
使用迭代器的情況:
6、replace(InF, InL, s2) 將 [InF, InL) 替換成 s2
7、replace(InF, InL, p) 將 [InF, InL) 替換成 [p, <null>)
8、replace(InF, InL, p, cnt) 將 [InF, InL) 替換成 [p, p + cnt)
9、replace(InF, InL, n, c) 將 [InF, InL) 替換成 n * c
10、replace(InF, InL, InF2, InL2) 將 [InF, InL) 替換成 [InF2, InL2)
4)erase() 刪除
1、erase(off, cnt) 從字符串 s 中刪除 s [off, off + cnt)
2、erase(iter) 從字符串 s 中刪除 *iter
3、erase(ItF, ItL) 從字符串 s 中刪除 [ItF, ItL)
八、取出字符串
1)取得 C 風(fēng)格字符串
c_str() 返回常量類型的 C 風(fēng)格字符串指針,copy(ptr, cnt, off = 0) 則將指定大小的字符串復(fù)制到特定指針。data() 在 Visual C++ 7.1 中僅僅調(diào)用了 c_str() 實(shí)現(xiàn)。
2)取得子字符串
substr(off, cnt) 取得 s [off, off + cnt) 的副本。
3)復(fù)制子字符串
copy(p, off, cnt) 將 s [off, off + cnt) 復(fù)制到 p。
九、字符串的緩沖區(qū)管理
字符串具有類似 std::vector 的緩沖區(qū)管理界面。
size() 取得有效元素長度
max_size() 取得當(dāng)前內(nèi)存分配器能分配的有效空間
reserve() 為緩沖區(qū)預(yù)留空間
capacity() 取得緩沖區(qū)的容量
resize() 重設(shè)串的長度,可以為其指定初始化值
十、定義輸入迭代器的尾端
向 istream_iterator 傳遞輸入流對象以創(chuàng)建輸入迭代器,輸入迭代器持有輸入流對象的指針,默認(rèn)創(chuàng)建和讀取流失敗的情況下該指針被設(shè)置為 0。并且在實(shí)現(xiàn)輸入迭代器間的 operator == 相等運(yùn)算時,進(jìn)行持有的流對象指針的相等比較,這樣,默認(rèn)創(chuàng)建的輸入迭代器將被用于匹配輸入流的結(jié)束。
- 當(dāng)輸入流讀取失敗,用戶執(zhí)行 if, while 條件判斷時,實(shí)際上先將判斷值轉(zhuǎn)換成 void* 類型,或者根據(jù) operator ! 運(yùn)算符的返回結(jié)果,對輸入流重載 operator void* 和 operator ! 運(yùn)算符,可以定義輸入流在布爾表達(dá)式中的行為,使得當(dāng)流讀取失敗的情況下,輸入迭代器可以通過布爾表達(dá)式來確認(rèn),而不是顯式訪問 fail() 成員函數(shù).