C++與演算法

文字處理函式

以下介紹一些常用的文字處理函式

適當使用就能處理各式各樣的文字了!


函式庫iostream

函式1 : cin.get() - 讀取下一個字元

http://www.cplusplus.com/reference/istream/istream/get/

  • 回傳 char

  • cin >> c 不同在,可以讀取 空白字元(' ')、換行字元('\n')

[input]

goodbye & hello

[output]

  • 空白字元 ASCII編號 32
  • 換行字元 ASCII編號 10
得到字元[g]  ASCII編號 [103]
得到字元[o]  ASCII編號 [111]
得到字元[o]  ASCII編號 [111]
得到字元[d]  ASCII編號 [100]
得到字元[b]  ASCII編號 [98]
得到字元[y]  ASCII編號 [121]
得到字元[e]  ASCII編號 [101]
得到字元[ ]  ASCII編號 [32]
得到字元[&]  ASCII編號 [38]
得到字元[ ]  ASCII編號 [32]
得到字元[h]  ASCII編號 [104]
得到字元[e]  ASCII編號 [101]
得到字元[l]  ASCII編號 [108]
得到字元[l]  ASCII編號 [108]
得到字元[o]  ASCII編號 [111]
得到字元[
]  ASCII編號 [10]

[code]

#include<iostream>
using namespace std;

int main()
{
    char c;

    while(true)
    {
        c = cin.get();
        cout << "得到字元[" << c << "]  ASCII編號 [" << (int)c << "]" << endl;
    }

    return 0;
}



函式2 : cin.peek() - 偷看即將要輸入的東西

http://www.cplusplus.com/reference/istream/istream/peek/

  • peek:偷看、窺視

  • 回傳 char

  • 會偷看到 空白字元(' ')、換行字元('\n')

[input]

392670
c++

[output]

即將要輸入數字開頭的東西
輸入了:392670
即將要輸入小寫字母開頭的東西
輸入了:c++

[code]

#include<iostream>
using namespace std;

int main()
{
    string s;
    char c;

    while(true)
    {
        c = cin.peek();

        if( '0' <= c and c <= '9' )
            cout << "即將要輸入數字開頭的東西" << endl;
        if( 'a' <= c and c <= 'z' )
            cout << "即將要輸入小寫字母開頭的東西" << endl;

        cin >> s;
        cin.get(); //先讀掉 換行字元'\n'   避免下次偷看到
        cout << "輸入了:" << s << endl;
    }

    return 0;
}



函式3 : cin.getline() - 讀取整行

http://www.cplusplus.com/reference/istream/istream/getline/

  • 可以一次讀取完整的一行( 包括空白字元 )

  • cin.getline( 字元陣列, 最多字元數 )

  • 函式會將輸入結果存在字元陣列裡

[input]

Let it go! Let it go!
Can't hold it back anymore

[output]

得到: Let it go! Let it go!
得到: Can't hold it back anymore

[code]

#include<iostream>
using namespace std;

int main()
{
    char s[105];

    while(true)
    {
        cin.getline( s, 100 );
        cout << "得到: " << s << endl;
    }

    return 0;
}



題目練習





函式庫string.h

http://www.cplusplus.com/reference/cstring/

  • 以下函式都必須先加入 #include<string.h> 才能使用

  • 皆只適用於 char陣列


函式4 : strlen() - 得到字串長度

http://www.cplusplus.com/reference/cstring/strlen/

  • strlen(字串)

  • 回傳 int 代表陣列長度

  • 是不包括 結束字元'\0' 的長度

  • 經常搭配 for迴圈 使用,走遍陣列裡所有字元

[input]

moe
esperanto

[output]

moe長度為3
第0個字元:m
第1個字元:o
第2個字元:e
esperanto長度為9
第0個字元:e
第1個字元:s
第2個字元:p
第3個字元:e
第4個字元:r
第5個字元:a
第6個字元:n
第7個字元:t
第8個字元:o

[code]

#include<iostream>
#include<string.h>
using namespace std;

int main()
{
    char s[100];
    int len, i;

    while( cin >> s )
    {
        len = strlen(s);

        cout << s << "長度為" << len << endl;

        for( i=0 ; i<len ; i++ )
            cout << "第" << i << "個字元:" << s[i] << endl;
    }

    return 0;
}



函式5 : strcmp() - 比較字典順序

http://www.cplusplus.com/reference/cstring/strcmp/

  • strcmp(字串1, 字串2)

  • 回傳 int 代表 比較結果

  • 若 字串1比字串2 字典順序較前,回傳 -1

  • 若 字串1和字串2 相同,回傳 0

  • 若 字串1比字串2 字典順序較後,回傳 1

  • 常用來看兩個字串相不相同

[input]

rock roll
roll rock
rock rock

[output]

順序正確
順序相反
兩字完全相同

[code]

#include<iostream>
#include<string.h>
using namespace std;

int main()
{
    char s1[100], s2[100];
    int result;

    while( cin >> s1 >> s2 )
    {
        result = strcmp( s1, s2 );

        if( result == -1 )
            cout << "順序正確" << endl;
        if( result == 0 )
            cout << "兩字完全相同" << endl;
        if( result == 1 )
            cout << "順序相反" << endl;
    }

    return 0;
}



題目練習

  • todo