Unity攝像機跟隨效果實現
字串是儲存在記憶體的連續位元組中的一系列字元,C++處理字串的方式有兩種。第一種來自C語言,常被稱為C-風格的字串(C-style string)。
儲存在連續位元組中的一系列字元意味著可以將字串儲存咋ichar陣列中,其中每個字元都位於自己的陣列元素中。字串提供了一種儲存文字資訊的便捷方式,如提供給使用者的訊息(“請告訴我您的瑞士銀行賬號”)或來自使用者的響應(“您肯定是在開玩笑”)。C-風格字串具有一種特殊的性質:以空字元結尾,空字元被寫作\0,其ASCII碼為0,用來標記字串的結尾,例如,請看下面兩個宣告:
char dog[8] = {'b', 'e', 'a', 'u', 'x', 'I', 'I'}; //not a string!
char cat[8] = {'f', 'a', 't', 'e', 's', 's', 'a', '\0'}; //a string!
這連個陣列都是char陣列,但只有第二個陣列是字串。空字元對C-風格字串而言是至關重要。例如,C++有很多處理字串的函式,其中包括cout使用的那些函式。它們都逐個地處理字串中的字元,直到到達空字串為止。如果使用cout顯示上面的cat這樣的字串,則將顯示前7個字元,發現空字元後停止。但是,如果使用cout顯示上面的dog陣列(它不是字串),cout將打印出陣列中的8個字母,並接著將記憶體中隨後的各個位元組解釋為要列印的字元,直到遇到空字元為止。由於空字元(實際上是被設定為0的位元組)在記憶體中很常見,因此這一過程將很快停止。但儘管如此,還是不應將不是字串的字元陣列當作字串來處理。
在cat陣列示例中,將陣列初始化為字串的工作看上去冗長乏味——使用大量單引號,且必須記住加上空字元。不必擔心,有一種更好的、將字元陣列初始化字串的方法——只需使用一個用引號括起的字串即可,這種字串被稱為字串常量或字串字面值,如下所示:
char bird[11] = "Mr.Cheeps"; //the \0 is understood
char fish[] = "Bubbles"; //let the compiler count
用引號括起的字串隱式地包括結尾的
字串是儲存在記憶體的連續位元組中的一系列字元,C++處理字串的方式有兩種。第一種來自C語言,常被稱為C-風格的字串(C-style string)。
儲存在連續位元組中的一系列字元意味著可以將字串儲存咋ichar陣列中,其中每個字元都位於自己的陣列元素中。字串提供了一種儲存文字資訊的便捷方式,如提供給使用者的訊息(“請告訴我您的瑞士銀行賬號”)或來自使用者的響應(“您肯定是在開玩笑”)。C-風格字串具有一種特殊的性質:以空字元結尾,空字元被寫作\0,其ASCII碼為0,用來標記字串的結尾,例如,請看下面兩個宣告:
char dog[8] = {'b', 'e', 'a', 'u', 'x', 'I', 'I'}; //not a string!
char cat[8] = {'f', 'a', 't', 'e', 's', 's', 'a', '\0'}; //a string!
這連個陣列都是char陣列,但只有第二個陣列是字串。空字元對C-風格字串而言是至關重要。例如,C++有很多處理字串的函式,其中包括cout使用的那些函式。它們都逐個地處理字串中的字元,直到到達空字串為止。如果使用cout顯示上面的cat這樣的字串,則將顯示前7個字元,發現空字元後停止。但是,如果使用cout顯示上面的dog陣列(它不是字串),cout將打印出陣列中的8個字母,並接著將記憶體中隨後的各個位元組解釋為要列印的字元,直到遇到空字元為止。由於空字元(實際上是被設定為0的位元組)在記憶體中很常見,因此這一過程將很快停止。但儘管如此,還是不應將不是字串的字元陣列當作字串來處理。
在cat陣列示例中,將陣列初始化為字串的工作看上去冗長乏味——使用大量單引號,且必須記住加上空字元。不必擔心,有一種更好的、將字元陣列初始化字串的方法——只需使用一個用引號括起的字串即可,這種字串被稱為字串常量或字串字面值,如下所示:
char bird[11] = "Mr.Cheeps"; //the \0 is understood
char fish[] = "Bubbles"; //let the compiler count
用引號括起的字串隱式地包括結尾的
每次讀取一行字串輸入
每次讀取一個單詞通常不是最好的選擇。例如,加成程式要求使用者輸入城市名,使用者輸入New York或Sao Paulo。您希望程式讀取並存儲完成的城市名,而不是New 或Sao。要將整條短語而不是一個單詞作為字串輸入,需要採用另一種字串讀取方法。具體的說,需要採用面向行而不是面向單詞的方法。幸運的是,istream中的類(如 cin)提供了一些面向行的類成員函式:getline()和get()。這兩個函式都讀取一行輸入,直到到達換行符。然而,隨後getline()將丟棄換行符,而get()將換行符保留在輸入序列中。下面將詳細介紹它們,首先介紹getline()。
1、面向行的輸入:getline()
getline()函式讀取整行,它使用通過回車鍵輸入的換行符來確定輸入結尾。要呼叫這種方法,可以使用cin.getline()。該函式有兩個引數。第一個引數是用來儲存輸入行的陣列的名稱,第二個引數是要讀取的字元數。如果這個引數為20,則函式最多就讀取19個字元,餘下的空間將用於儲存自動在結尾處新增的空字元。getline()成員函式在讀取指定數目的字元或遇到換行符時停止讀取。
例如,假設要使用getline()將姓名讀入到一個包含20個元素的name陣列中。可以使用這樣的函式呼叫:cin.getline(name,20);
這將把一行讀入到name陣列中——如果這行包含的自讀不超過19個(getline()成員函式還可以接受第三個可選引數)
2、面向行的輸入:get()。。
我們來試試另一種方法。istream類有另一個名為get()的成員函式,該函式有幾種變體。其中一種變體的工作方式與getline()類似,它們接受的引數相同,解釋引數的方式也相同,並且都讀取到行尾。但get並不在讀取並丟棄換行符,二十將其留在輸入佇列中。假設我們連續兩次呼叫get():
cin.get(name, ArSize);
cin.get(dessert, ArSize); // a problem
由於第一次呼叫後,換行符將留在輸入佇列中,因此第二次呼叫時看到的第一個字元便是換行符。因此get()認為已到達行尾,而沒有發現任何可讀取的內容。如果不借助於幫助,get()將不能跨過該換行符。
幸運的是,get()已經有另一種變體。使用不帶任何引數的cin.get()呼叫可讀取下一個字元(即使是換行符),伊尼茨可以用它來處理換行符,為讀取下一行輸入做好準備。也就是說,可以採用下面的呼叫序列:
cin.get(name, ArSize); // read first line
cin.get(); // read newline
cin.get(dessert, ArSize); // read second line
另一種使用get()的方式是將兩個類成員函式拼接起來(合併),如下所示:
cin.get(name, ArSize).get(); // concatenate member funtions
之所以這樣做,是由於cin.get(name, ArSize)返回一個cin物件,該物件隨後將被用來呼叫get()函式。同樣,下面的語句將把輸入的連續的兩行分別讀入陣列name1和name2中,其效果與兩次呼叫cin.getline()相同:
cin.getline(name1, ArSize).getline(name2, ArSize);
其他形式的字串字面值
除char型別外,C++還有型別wchar_t;而C++11新增了型別char16_t和char32_t。可建立這些型別的陣列和這些型別的字串面值。對於這些型別的字串面值,C++分別使用字首L,u和U表示,下面是一個如何使用這些字首的例子:
wchar_t title[] = L"Chief Astrogator"; //w_char dtring
char16_t name[] = u"Felonia Ripova"; // char_16 string
char32_t car[] = U"Humber Super Snipe"; // char_32 string
C++新增的另一種型別是原始(raw)字串。在原始字串中,字元表示的就是自己,例如,序列\n不表示換行符,
永遠跟黨走,心中有黨,事業理想。
⣿⣿⣿⣿⣿⠟⠋⠄⠄⠄⠄⠄⠄⠄⢁⠈⢻⢿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⠃⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠈⡀⠭⢿⣿⣿⣿⣿
⣿⣿⣿⣿⡟⠄⢀⣾⣿⣿⣿⣷⣶⣿⣷⣶⣶⡆⠄⠄⠄⣿⣿⣿⣿
⣿⣿⣿⣿⡇⢀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠄⠄⢸⣿⣿⣿⣿
⣿⣿⣿⣿⣇⣼⣿⣿⠿⠶⠙⣿⡟⠡⣴⣿⣽⣿⣧⠄⢸⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣾⣿⣿⣟⣭⣾⣿⣷⣶⣶⣴⣶⣿⣿⢄⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⡟⣩⣿⣿⣿⡏⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣹⡋⠘⠷⣦⣀⣠⡶⠁⠈⠁⠄⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣍⠃⣴⣶⡔⠒⠄⣠⢀⠄⠄⠄⡨⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣦⡘⠿⣷⣿⠿⠟⠃⠄⠄⣠⡇⠈⠻⣿⣿⣿⣿
⣿⣿⣿⣿⡿⠟⠋⢁⣷⣠⠄⠄⠄⠄⣀⣠⣾⡟⠄⠄⠄⠄⠉⠙⠻
⡿⠟⠋⠁⠄⠄⠄⢸⣿⣿⡯⢓⣴⣾⣿⣿⡟⠄⠄⠄⠄⠄⠄⠄⠄
⠄⠄⠄⠄⠄⠄⠄⣿⡟⣷⠄⠹⣿⣿⣿⡿⠁⠄⠄⠄⠄⠄⠄⠄⠄
永遠跟黨走,心中有黨,事業理想。
⣿⣿⣿⣿⣿⠟⠋⠄⠄⠄⠄⠄⠄⠄⢁⠈⢻⢿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⠃⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠈⡀⠭⢿⣿⣿⣿⣿
⣿⣿⣿⣿⡟⠄⢀⣾⣿⣿⣿⣷⣶⣿⣷⣶⣶⡆⠄⠄⠄⣿⣿⣿⣿
⣿⣿⣿⣿⡇⢀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠄⠄⢸⣿⣿⣿⣿
⣿⣿⣿⣿⣇⣼⣿⣿⠿⠶⠙⣿⡟⠡⣴⣿⣽⣿⣧⠄⢸⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣾⣿⣿⣟⣭⣾⣿⣷⣶⣶⣴⣶⣿⣿⢄⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⡟⣩⣿⣿⣿⡏⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣹⡋⠘⠷⣦⣀⣠⡶⠁⠈⠁⠄⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣍⠃⣴⣶⡔⠒⠄⣠⢀⠄⠄⠄⡨⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣦⡘⠿⣷⣿⠿⠟⠃⠄⠄⣠⡇⠈⠻⣿⣿⣿⣿
⣿⣿⣿⣿⡿⠟⠋⢁⣷⣠⠄⠄⠄⠄⣀⣠⣾⡟⠄⠄⠄⠄⠉⠙⠻
⡿⠟⠋⠁⠄⠄⠄⢸⣿⣿⡯⢓⣴⣾⣿⣿⡟⠄⠄⠄⠄⠄⠄⠄⠄
⠄⠄⠄⠄⠄⠄⠄⣿⡟⣷⠄⠹⣿⣿⣿⡿⠁⠄⠄⠄⠄⠄⠄⠄⠄
china NO.1