【C++】C++中的字符和字符串

目錄結構:ios

contents structure [-]

 

 

標準庫類型string表示可變長的字符序列,使用string類型必須首先包含string頭文件,做爲標準庫的一部分string定義在標準庫std中。c++

#include <string>//引用頭文件
using std::string;

 

1.定義和初始化string

如何初始化類由類自己決定,一個類能夠定義多種初始化對象的方式。

git

string s1;//默認初始化
string s2(s1);//s2是s1的副本
string s2 = s1;//等價於s2(s1),s2是s1的副本
string s3("value");//s3是字面值"value"的副本,除了字面值最後的那個空字符外
string s3 = "value";//等價於s3("value"),s3是字面值"value"的副本
string s4(n,'c');//把s4初始化爲由連續n個字符'c'組成的串

2.string對象上的操做

一個類除了要規定初始化其對象的方式外,還要定義對象上所能執行的操做。下面是string對象的大多數操做。數組

os << s //將s寫到輸出流os當中,返回os
is >> s //從輸入流is中讀取字符串賦給s,字符串以空白分割,返回is
getline(is,s) //從is中讀取一行賦給s,返回is
s.empty() //s爲空返回true不然返回false
s.size() //返回s中字符的個數
s[n] //返回s中第n個字符的引用,位置n從0開始
s1+s2 //返回字符串s1和s2鏈接後的結果
s1=s2 //用s2的副本代替s1中原來的字符
s1==s2 //若是字符串s1和字符串s2中的字符徹底同樣,則返回true,不然爲false
s1!=s2 //若是字符串s1和字符串s2中的字符不同,則返回true,不然返回false
<,<=,>,>= //利用字符在字典中的順序進行比較,且對字母的大小寫敏感

 

下面的案例展現部分方法的使用,案例:函數

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

int main(){
    string s;
    cout << "請輸入: \n";
    cin >> s;//注意:這裏以空格分隔,若是想讀取整行數據,可使用getline方法

    cout << "你的輸入是: \n";
    cout << s << endl;

    s = "abc";
    if(s.empty())
        cout << "s是空\n";
    else
        cout << "s非空\n";

    auto size = s.size();//size()函數的返回值是size_type類型,一種無符號整數類型
    cout << "s size is: " << size << "\n";

    //使用迭代器循環輸出每一個字符
    for(auto a = begin(s); a!=end(s); a++){
        cout << *a << " ";
    }
    //使用指針循環輸出每一個字符
    for(char *c = &s[0], c!=&s[s.size()]; c++){
        cout << *c << " ";
    }
    cout << endl;
    return 0;
}

begin()返回指向首元素的迭代器,end()返回指向尾元素下一元素的迭代器。

因爲字符串的size()方法的返回值是size_type類型,一種無符號整數類型,因此若是n是一個負數,那麼下面的例子老是成立的s.size() < n,由於n會自動轉化爲一個較大的無符號值。所以須要判斷字符串的大小,應該先把s.size()的類型轉化爲有符號的整形,而後再和n比較。例如:spa

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

int main(){
    string s("abc");
    int n = -10;
    cout << (s.size() < n) << "\n";//比較失敗

    int size = s.size();//先將size_type轉化爲有符號類型
    n = -10;
    cout << (size < n) << "\n";//比較成功
    cout << endl;

    return 0;
}

 輸出結果爲:指針

1

0

-10是有符號整形,在和無符號整形比較時候,會自動轉化爲一個較大的無符號整形(只有負數纔會發生轉化,正數不會發生)。因此正確的思路應該是,先把無符號整形轉化爲有符號整形,而後再比較。或是兩個都是無符號整形。code

 

3.處理string對象中的字符

在<cctype>頭文件中,定義了一系列的標準字符處理函數。<cctype>是C語言頭文件ctype.h的版本。
下面列舉了一些主要函數:對象

isalnum(c)//當c是字母或數字時爲真
isalpha(c)//當c是字母時爲真
isdigit(c)//當c是數字時爲真
ispunct(c)//當c是標點符號時爲真
isspace(c)//當c是空格時爲真
islower(c)//當c是小寫字母時爲真
isupper(c)//當c是大寫字母時爲真
tolower(c)//將c轉化爲小寫字母
toupper(c)//將c轉化爲大寫字母

案例:blog

#include <string>
#include <cctype>
#include <iostream>
using namespace std;

int main(){
    string str("abc");
    for(auto a : str){
        cout << a << endl;
    }
    for(auto &a : str){
        a = toupper(a);//轉化爲大寫
    }
    for(char *c=&str[0]; c!=&str[str.size()]; c++){
        cout << *c << endl;
    }
    return 0;
}

4.C風格字符串

字符串字面值是一種通用結構的實例,這種結構是從c繼承而來的C風格字符串(C-style character string),c風格字符串不是一種類型,而是一種約定俗成的寫法,按照書寫習慣,通常以空字符結束(null terminated),以空字符結尾的意思就是在字符串的最後一個字符後面加上'\0',通常利用指針來操做這些字符串。

同時在c++中的<cstring>頭文件中,cstring是C語言頭文件string.h的C++版本。

strlen(p) //返回p的長度,空字符不計算在內
strcmp(p1,p2) //比較p1和p2的相等性,若是p1==p2,那麼返回0。若是p1>p2,那麼返回一個正值。若是p1<p2,那麼返回一個負值。
strcat(p1,p2) //將p2附加到p1後,返回p1
strcpy(p1,p2) //將p2拷貝給p1,返回p1

 

在用數組的形式初始化字符數組時,必定要以空字符‘\0’結尾。在使用字符串初始化字符數組時,會自動在末尾加上空字符'\0'。同時,<cstring>標準庫中的方法,都是空字符結尾做爲字符結尾的標誌,若是未加空字符結尾,那麼可能發生意想不到的結果。

char ch[] = {'C','+','+','\0'};//這裏要以空字符結束
cout << strlen(ch) << endl;//3
char ch2[] = "C++";//當把字符串賦值給char[]時,會自動在末尾添加\0

for(char *c=ch2; *c!='\0'; c++){
    cout << *c << " ";
}

字符數組在使用他的名稱的時候,編譯器會在不一樣的位置給他編譯成不一樣的類型。
例如:

#include <iostream>
#include <string>
#include <cctype>
using namespace std;

int main(){
        char c[] = {'c','+','+','\0'};
        for(char *ch=c; *ch!='\0';ch++)//這裏將c編譯成首元素的地址
                cout << *ch << endl;

        cout << c << endl;//這裏輸出數組中的全部元素

        int i[]={1,2};
        cout << i << endl;

    string s[] = {"a","bc"};
    cout << s << endl;

        return 0;
}

輸入結果:

c
+
+
c++
0x7ffc37de8200
0x7ffc37de81c0

從結果中能夠看出,當單獨使用字符數組名稱時,它會遍歷其中的全部字符。當和指針聯合使用時,它會返回首元素的指針。然而其餘的數組(int[],string[])都沒有這個特性。

除了上面的寫法,還可能會看到下面的這種寫法(讓一個char指針指向一個字符串字面值常量,不是string):

char *cp = "c++";//等同於char *cp = "c++\0";

這種狀況下,cp是一個字符指針。並且在單獨使用cp的時候,也會遍歷他的全部字符。當使用*cp時表明指向字符的首元素。
可使用以下的方式遍歷:

for(char *p = cp; *p!="\0"; p++)//注意這裏是雙引號"\0",不是單引號
    cout << *p << endl;

 

如何把一個string轉化爲char[]數據

可使用strcpy,copy來實現:

#include <iostream>/*cout*/
#include <string>/*string*/
#include <cstring>/*strcpy*/
int main()
{
    std::string s = "Hello World!";
    char *cstr = new char[s.size() + 1];
    strcpy_s(cstr,strlen(cstr),&s[0]);
   //strcpy(cstr, s.c_str()); // 或者傳遞 &s[0]    

    std::cout << cstr << '\n';
delete cstr;
return 0; }
相關文章
相關標籤/搜索