一 命名空間using聲明
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
int main()
{
cout << "Enter two numbers:" << endl;`
int v1, v2;
cin >> v1 >> v2;
cout << "The sum of " << v1 << " and " << v2 << " is " << v1 + v2 << endl;
return 0;
}
注意:位于頭文件的代碼一般來(lái)說(shuō)不應(yīng)使用using聲明。因?yàn)槭穷^文件的內(nèi)容會(huì)拷貝到所有引用它的文件中去。
二 標(biāo)準(zhǔn)庫(kù)類型string
1 定義和初始化
標(biāo)準(zhǔn)庫(kù)類型string表示可變長(zhǎng)的字符序列,使用string類型必須首先包含string頭文件:#include <string>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
int main()
{
string s1;
string s2 = s1;
string s3 = "hello";
string s4(10, 'c');
cout << s3 << endl << s4 << endl;
return 0;
}
直接初始化和拷貝初始化
C++語(yǔ)言有多種初始化方式:如果使用等號(hào)(=)初始化一個(gè)變量,執(zhí) 行的是拷貝初始化,編譯器把等號(hào)右側(cè)的初始值拷貝到新創(chuàng)建的對(duì)象中去;如果不使用等號(hào),執(zhí)行的是直接初始化。
string s3 = "hello"; // 拷貝初始化
string s4(10, 'c'); // 直接初始化,s4內(nèi)容是cccccccccc
2 string對(duì)象操作
| string操作 | 含義 |
|---|---|
| getline(is, s) | 從is中讀取一行賦給s,返回is |
| s.empty() | s為空返回true,否則返回false |
| s.size() | 返回s中字符個(gè)數(shù) |
| s[n] | 返回s中第n個(gè)字符的引用,位置n從0開始 |
| s1 + s2 | 返回s1和s2連接后的結(jié)果 |
| s1 = s2 | 用s2的副本代替s1中原來(lái)的字符 |
| s1 == s2, s1 != s2 | 判斷s1和s2是否相等或不等,大小寫敏感 |
| <, <=, >, >= | 利用字典序進(jìn)行字符比較,大小寫敏感 |
讀寫string對(duì)象
string s;
cin >> s;
string對(duì)象會(huì)自動(dòng)忽略開頭空白(空格符、換行符、制表符等)并從第一個(gè)真正的字符開始讀起,直到遇到下一處空白。
讀取未知數(shù)量string對(duì)象
int main()
{
string word;
while (cin >> word)
cout << word << endl;
return 0;
}
while檢測(cè)流是否有效,一旦遇到文件結(jié)束標(biāo)記或非法輸入,循環(huán)結(jié)束。
getline讀取一整行
getline函數(shù)可以保留輸入時(shí)的空白符,其參數(shù)為一個(gè)輸入流和一個(gè)string對(duì)象。getline函數(shù)一遇到換行符就結(jié)束讀取并返回結(jié)果。如果輸入一開始就是換行符,所得即為一個(gè)空string。
int main()
{
string line;
while (getline(cin, line))
cout << line << endl;
return 0;
}
empty和size操作
empty函數(shù)根據(jù)string對(duì)象是否為空返回一個(gè)布爾值。
size函數(shù)返回string對(duì)象的長(zhǎng)度(string對(duì)象中字符的個(gè)數(shù)),返回一個(gè)string::size_type類型的值。
在C++11中,允許編譯器通過(guò)auto或者decltype來(lái)推斷變量類型:
auto len = line.size();
字面值和string對(duì)象相加
由于歷史原因,C++語(yǔ)言中字符串字面值并不是標(biāo)準(zhǔn)庫(kù)類型string對(duì)象。故字面值與string相加時(shí),為了可以自動(dòng)轉(zhuǎn)換成所需類型,必須確保每個(gè)加法運(yùn)算符(+)兩側(cè)的運(yùn)算對(duì)象至少有一個(gè)是string。
3 處理string對(duì)象中的字符
| 函數(shù)名稱 | 返回值 |
|---|---|
| isalnum(c) | 如果參數(shù)是字母數(shù)字,即字母或數(shù)字,該函數(shù)返回true |
| isalpha(c) | 如果參數(shù)是字母,該函數(shù)返回true |
| isblank(c) | 如果參數(shù)是空格或水平制表符,該函數(shù)返回true |
| iscntrl(c) | 如果參數(shù)是控制字符,該函數(shù)返回true |
| isdigit(c) | 如果參數(shù)是數(shù)字(0~9),該函數(shù)返回true |
| isgraph(c) | 如果參數(shù)是除空格之外的打印字符,該函數(shù)返回true |
| islower(c) | 如果參數(shù)是小寫字母,該函數(shù)返回true |
| isprint(c) | 如果參數(shù)是打印字符(包括空格),該函數(shù)返回true |
| ispunct(c) | 如果參數(shù)是標(biāo)點(diǎn)符號(hào),該函數(shù)返回true |
| isspace(c) | 如果參數(shù)是標(biāo)準(zhǔn)空白字符,如空格、進(jìn)紙、換行符、回車、水平制表符或者垂直制表符,該函數(shù)返回true |
| isupper(c) | 如果參數(shù)是大寫字母,該函數(shù)返回true |
| isxdigit(c) | 如果參數(shù)是十六進(jìn)制的數(shù)字,即0~9、af、AF,該函數(shù)返回true |
| tolower(c) | 如果參數(shù)是大寫字符,則返回其小寫,否則返回該參數(shù) |
| toupper(c) | 如果參數(shù)是小寫字母,則返回其大寫,否則返回該參數(shù) |
注意:盡量使用C++版本的C標(biāo)準(zhǔn)庫(kù)頭文件。C語(yǔ)言中頭文件形如name.h,C++則將這些文件命名為cname。即去掉了.h后綴,在文件名name前添加字母c。在名為cname的頭文件中定義的名字從屬于命名空間std,而定義在名為.h的頭文件則不然。
基于范圍的for語(yǔ)句
for (declaration: expression)
statement
例如:
int main()
{
string str("some string");
for (auto c : str)
cout << c << endl;
return 0;
}
插曲:我使用的IDE是codeblock 13.12,起初編譯并不支持C++11,需要做如下設(shè)置:
Settings->Compiler->Compiler Settings->Have g++ follow the C++11 ISO C++ language standard
統(tǒng)計(jì)string對(duì)象中標(biāo)點(diǎn)符號(hào)的個(gè)數(shù):
int main()
{
string line;
getline(cin, line);
a
decltype(line.size()) punct_cnt = 0;
for (auto c : line)
if (ispunct(c))
++punct_cnt;
cout << punct_cnt << endl;
return 0;
}
將字符串轉(zhuǎn)換為大寫形式:
int main()
{
string line;
getline(cin, line);
for (auto &c : line)
c = toupper(c);
cout << line << endl;
return 0;
}
使用下標(biāo)執(zhí)行迭代
將line的第一個(gè)單詞改為大寫:
int main()
{
string line;
getline(cin, line);
for (decltype (line.size()) index = 0; index != line.size() && !isspace(line[index]); ++index)
line[index] = toupper(line[index]);
cout << line << endl;
return 0;
}
10進(jìn)制轉(zhuǎn)16進(jìn)制:
int main()
{
const string hexdigits = "0123456789ABCDEFG";
string result;
decltype(hexdigits.size()) n;
while(cin >> n)
if(n < hexdigits.size())
result += hexdigits[n];
cout << result << endl;
return 0;
}
去除字符串中標(biāo)點(diǎn)符號(hào):
int main()
{
string line;
getline(cin, line);
for(auto &c: line)
if(!ispunct(c))
cout << c;
return 0;
}