//第一種方法:
int year;
cin >> year;
cin.get(); //or cin.get(ch);
char name[10];
cin.getline(name,10);
//第二種方法:
int year;
(cin >> year).get(); //or (cin >> year).get(ch);
char name[10];
cin.getline(name,10);
string類:可以簡單將string作為一種定義字串資料型別變數的方法,不同於陣列字串的是,我們事先無需確定其占有空間的大小,程式將結合其內容動態調整。要使用string類,必須包含標頭檔案string,且使用using namespace std
語句,或者使用全稱std::string來引用它。用string定義的字串變數可直接通過cin和cout實現賦值和列印。
wchar_t、char16_t、char32_t字元型別
以上寬字元型別,分別冠以l、u、u字首,後兩種為c++11新增的,其使用如下:
wchar_t title = l"chief astrogator";
char16_t name = u"felonia ripova";
char32_t name = u"humber super";
c++11還支援unicode字元編碼方案utf-8。使用u8字首來表示該型別字串字面值。
c++還支援原始字串(raw)。原始字串表示的就是自己,例如\n不再表示換行符,而是\和n本身。因此,原始字串以r作為字首,且使用 「( 和 )「 表示字串的起始和終止符。例如:
cout << r"(jim "king" uses "\n" instead of endl.)" << '\n'
上述**將輸出:jim "king" uses "\n" instead of endl.
而如果使用標準字串字面值,將需要如下編碼:
cout << "jim \"king\" uses \"\\n\" instead of endl." << '\n'
如果在原始字串中需要輸入「( 和 )」時又該如何表達呢?此時你可以自定義定界符,只要滿足「(或)」之間加入任意數量的除空格、左右括號、斜槓和製表符、換行符等控制字元之外的基本字元即可。例如「+-(和)+-」在鍵盤上輸入原始字串時,按下回車鍵不僅會移到下一行,而且還會在原始字串中新增回車字元。
可將字首r與其它字串字首結合使用,例如ru、ur等。
struct inflatable //結構體宣告
;struct inflatable goose; //c風格,struct必須包含
balls goose; //c++風格,struct可省略
結構中的位欄位
與c一樣,欄位的型別應為整型或列舉,接下來是欄位名(可選)和冒號,後面跟字段的位數,一般用以表示某暫存器結構。
struct torgle_register
;torgle_register tr = ;
共同體一般用於物件可能是多種資料型別的情況,可以大大節省儲存空間。例如商品id既可能是數字也可能是字串:
struct widget
id_val;
};...
widget prize;
...if (prize.type == 1)
cin >> prize.id_val.id_num;
else
cin >> prize.id_val.id_char;
當然,也可以使用匿名共同體,此時上述程式可以改寫為:
struct widget;};
...widget prize;
...if (prize.type == 1)
cin >> prize.id_num;
else
cin >> prize.id_char;
由於匿名,id_num和id_char被視為prize的兩個成員,因為他們的位址相同,所以不需要使用中間識別符號id_val。程式猿負責確定當前哪個成員是活動的。
enum提供了另一種建立符號常量的方式,這種方式可以代替const。其句法如下:
enum spectrum ;
以上定義讓spectrum成為新的型別名稱,其定義的變數只允許賦大括號的值(red, orange等),預設情況下,依次賦值0,1,2…給red, orange等。當然,也可以顯示的指定整數值來覆蓋預設值。
列舉變數僅定義了賦值運算,其它運算子對其非法。
列舉變數是整型,可被提公升賦值給int變數,但反過來結果未知。但如果int變數的值在列舉值範圍內,則也是可以的,如定義了乙個spectrum列舉變數band,如下句子合法:band = spectrum(3);
。
如果只使用列舉常量,而不建立列舉型別的變數,則可以省略列舉型別名稱。
//預設依次從0增加,後者的值比前者的值加1.若前者顯示賦值,則後者在前值基礎上加1
enum bits ;
//zero = null =0; one = numero_uno = 1,two = 2.
c++通過強制型別轉換,可以將在列舉變數取值範圍內的整數合法的賦給列舉變數。這個範圍是:上限是列舉變數最大值向上取2的冪整減去1,下限是0或者負數的向下取2的冪整加1.
enum bits ; //rang=[0, 15]
enum aha ; //rang=[-7, 127]
aha value;
value = aha(120); //合法
所以,只要賦給bits型別列舉變數的整數值在[0,15]範圍內都是合法的,賦給aha型別列舉變數的整數值在[-7,127]範圍內都是合法的.
每個列舉變數占用儲存空間大小由編譯器決定,早期c++,只能將int型賦給列舉變數,但新版本可以使用long,甚至long long型的值。所以其取值範圍小的可以用單位元組,取值範圍大的可以用4位元組。
int *ptr_a; //c style
int* ptr_a; //c++ style
int* ptr_a, ptr_b; //ptr_a是指標,但ptr_b是int變數!!!
int *ptr_a, *ptr_b; //此時二者均為指標!
long *fellow; //定義了乙個位址,但未賦初值。
*fellow = 22334; //將22334存貯在乙個未知位址,極其危險!!!
int *ptr;
ptr = (int *)0xb8000000;
int *ps = new int;
...delete ps; //釋放ps指向的空間到記憶體池中,但ps指標變數不會被刪除,可以重新指向另乙個位址。
int *ps = new int;
int *pq = ps;
delete pq; //僅需要釋放一次,不需要再釋放ps了。
int *psome = new int[10];//分配含10個int元素的陣列,並返回陣列首位址
int *pone = new int;
。。。delete psome; //釋放動態陣列
delete pone; //非法!!!
delete null; //合法。
int * ps = new int[3];
int pa[3];
...size_ps = sizeof(ps); //得到的是位址大小4,假設位址變數占用4個位元組空間
size_pa = sizeof(pa); //得到陣列大小3*4=12,假設int變數占用4個位元組空間
int * ps = new int[3];
ps[0] = 0; //or *ps = 0;
ps[1] = 1; //等價於 *(ps+1) = 1;
ps[2] = 2;
cout << ps[0] << endl; //輸出0
cout << ps[0] << endl; //輸出1
ps -= 1;
delete ps;
#include ...
using namespace std;
vectorvi; //建立0長度的整型陣列vi
int n;
cin >> n;
vectorvd(n); //根據使用者輸入建立乙個長度為n的雙實型陣列
如果想建立長度固定的陣列,且操作比陣列方便,那就選擇array。它與陣列一樣,使用棧空間,其效率同陣列,但更方便和安全。建立array,需要包含標頭檔案array。
#include ...
using namespace std;
arrayai; //建立包含5個元素的整型陣列ai
arrayad = ; //建立包含4個元素的double型陣列di
為了錯誤引用陣列界外的元素,可使用array類的成員函式at(index),它會檢查提供的索引值index是否在陣列界內。 C plus6th 第6章 分支和邏輯運算子
int num while cin num 當輸入的是非數字時,cin返回false 字元函式 使用檔案輸出的主要步驟 雖然標頭檔案iostream提供了乙個預先定義好的名為cout的ostream物件,但我們在操作檔案時必須宣告自己的ofstream物件,並為其命名,將其同檔案關聯起來。此後便可以...
第4章 復合型別
第 4 章 復合型別 一 陣列 潛規則 只有在定義陣列時才能使用初始化。不能將乙個陣列賦給另乙個陣列。如果初始化為,則表示第乙個元素被設定為1,其他元素被設定為0。二 字串 注意要點 在確定儲存字串所需的最短陣列時,記得將結尾的空字元計算在內。如果要顯示部分字串,只需將需要的字串的結尾標記為 0 每...
C primer plus 第4章 復合型別
1.陣列初始化 2.字串 兩種方式 c 風格字串 以 0結尾 string類庫 單引號表示字元常量 a 是字串編碼的簡寫,char a a 是正確的。但是 a 表示的是兩個字元a和 0組成的字串,實際上 a 表示的是字串所在的記憶體位址,因此char a a 是非法的 1 cin.getline a...