1. 程式人生 > >C++ primer 習題第四章(2)

C++ primer 習題第四章(2)

4.26 編寫程式從標準輸入裝置讀入一個string型別的字串。考慮如何程式設計實現從標準輸入裝置讀入一個C風格字串。

int main()
{
	cout << "C++ style" << endl;
	string str;
	cin >> str;
	cout << str << endl;
	cout << "C style" << endl;

	char ch[10];
	char *p = ch;
	while (p != ch + 10){
		cin >> *p++;
	}
	for (int i = 0; i < sizeof(ch) / sizeof(char); ++i)
		cout << ch[i] << endl;
}


4.28 編寫程式從標準輸入裝置讀入的元素資料建立一個int型的vector物件,然後動態建立一個與該vector物件大小一致的陣列,把vector物件的所有元素賦值給新陣列。

int main()
{
	vector<int> vec;
	int a;
	while (cin>>a){
		vec.push_back(a);
	}
	const int n = vec.size();
	int *p = new int[n];
	
	int i = 0;
	for (vector<int>::iterator iter = vec.begin(); iter != vec.end(); ++iter, ++i){
		p[i] = *iter;
		cout << p[i] << endl;
	}

	delete[] p;
	return 0;
}


4.30 編寫程式連線兩個C風格字串字面值,把結果儲存在一個C風格字串中。然後再編寫程式連線兩個string型別字串,這兩個string型別字串與前面的C風格字串字面值有相同的內容。

int main()
{
	
	const char *pc1 = "hello";
	const char *pc2 = "world";
	char *pc = new char[strlen(pc1) + strlen(pc2) + 1];
	char *pd = pc;
	while (*pc1)
	{
		*pc = *pc1;
		++pc;
		++pc1;
	}
	while (*pc2)
	{
		*pc = *pc2;
		++pc;
		++pc2;
	}
	*pc = '\0';
	
	string str="Hello";
	string str2 = "World";
	string str3 = str + str2;
	cout << str3 << endl;
	delete[] pd;
	return 0;
}


4.31 編寫從標準輸入裝置讀入字串,並把該串存放在字元陣列中。描述你的程式如何處理可變長的輸入。提供比擬分配的陣列長度長的字串資料測試你的程式。

int main()
{
	//固定陣列元素個數
	string str;//for enter the string object
	const size_t str_size = 10;
	char ch[str_size + 1];
	cout << "Enter the string" << endl;
	cin >> str;
	size_t len = str.size();
	if (len > str_size){
		len = str_size;
	}
	strncpy(ch, str.c_str(), len);
	ch[len + 1] = '\0';
	//不固定,動態陣列
	string str2;
	cin >> str2;
	const size_t len_str2 = strlen(str2.c_str());
	char *ch1 = new char[len_str2 + 1];
	char *ch2 = ch1;
	for (string::iterator iter = str2.begin(); iter != str2.end(); ++iter,++ch2){
		*ch2 = *iter;
	}
	*ch2 = '\0';
	delete [] ch1;
	
	return 0;
}


4.32 編寫程式用int 型陣列初始化vector 物件。

int main()
{
	int a[3] = { 1, 2, 3 };
	vector<int> vec(a,a+3);
	for (vector<int>::iterator iter = vec.begin(); iter != vec.end(); ++iter){
		cout << *iter << endl;
	}
	return 0;
}

4.33編寫程式把int型vector複製給int 陣列。

int main()
{
	vector<int> vec = { 1, 2, 3 };
	int *a=new int[vec.size()];
	int *b = a;
	for (vector<int>::iterator iter = vec.begin(); iter != vec.end(); ++iter, ++b){
		*b = *iter;
		cout << *b << endl;
	}
	delete [] a;
	return 0;
}

4.34 編寫程式讀入一組string型別的資料,並將它們儲存在vector中。接著,把該vector物件複製給一個字元指標陣列。為vector中的每個元素建立一個新的字元陣列,並把該vector元素的資料複製到相應的字元陣列中,最後把指向該陣列的指標插入字元指標陣列。

int main(){
	string str;
	vector<string> V_str;
	
	
	while (cin >> str){
		V_str.push_back(str);
	}
	char **ch = new char*[V_str.size()];

	size_t i(0);
	int j(0);
	for (vector<string>::iterator iter = V_str.begin(); iter != V_str.end(); ++iter,++i){
		char *c = new char[(*iter).size()+1];
		for (j = 0; j < (*iter).size(); ++j){
			c[j] = (*iter)[j];
		}
		c[j] = '\0';
		ch[i] = c;
	}
	for (vector<string>::iterator iter2 = V_str.begin(); iter2 != V_str.end(); ++iter2){
		cout << *iter2 << endl;
	}
	for (i = 0; i != V_str.size(); ++i){
		cout << ch[i] << endl;
	}
	for (i = 0; i != V_str.size(); ++i){
		delete[] ch[i];
	}
	cout << "Successful!" << endl;
	delete[]ch;
	return 0;
}

4.35 輸出習題4.34中建立的vector 物件和陣列的內容。輸出陣列後,記得釋放字元陣列。

4.34