C++學(xué)習(xí)手記一:命名空間和字符串

一 命名空間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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容