1. 程式人生 > >sscanf 和 sprintf 和c_str() 和 str()

sscanf 和 sprintf 和c_str() 和 str()

掌握c語言 字串轉換     c++字串轉換

注意c_str()返回時 臨時變數,存在銷燬的可能 所以最好把內容複製了

#include<iostream>
#include<cstdio>
#include<string>
#include<sstream>

using namespace std;


//c++方法 將double數值 轉換成string物件
string convertToString(double x)
{
	ostringstream o;
	if(o<<x)//將x作為string流入o //很像c語言裡面的sprintf
		return o.str();//將o中的值轉換成string物件
	else
		return "conversion error";//o讀取x失敗
}

/*c_str()函式返回一個指向正規C字串的指標, 內容與本string串相同.
這是為了與c語言相容,在c語言中沒有string型別,故必須通過string類物件的成員函式c_str()把string 物件轉換成c中的字串樣式。
注意:一定要使用strcpy()函式 等來操作方法c_str()返回的指標
比如:最好不要這樣:
char* c;
string s="1234";
c = s.c_str(); //c最後指向的內容是垃圾,因為s物件被析構,其內容被處理

應該這樣用:
char c[20];
string s="1234";
strcpy(c,s.c_str());
這樣才不會出錯,c_str()返回的是一個臨時指標,不能對其進行操作*/

//c++方法 將string物件轉換成double數值;
double convertFromString(string & s)
{
	istringstream is(s);
	double x;
	if(is>>x)//很像c語言裡面的sscanf 從流中第一個字元開始分流出一個double
		return x;
	else
		return 0.0;
}




int main(){

	//sscanf()  從第一個字串引數 寫入 第三個引數(取地址)
	char a[100] = "4564.46", b[100] = "4646";
	double a1;
	int b1;
	//sscanf(a + 2, "%lf", &a1);
	sscanf(a + 4, "%lf", &a1);//從小數點開始讀  會幫您補0
	//sscanf(b + 3, "%d", &b1);  //不要超過  來讀
	sscanf(b, "%d", &b1);
	cout << a1 << endl;
	cout << b1 << endl;


	//sprintf()   從第三個引數 寫入 第一個字串引數(不用取地址)
	double d = 123.46;
	char d1[100];
	int c = 464341;
	char c1[100];
	sprintf(c1, "%d", c);
	cout << c1 << endl;
	sprintf(d1, "%.1lf", d); //可以控制精度(四捨五入好像)  不然預設小數點6位
	cout << d1 << endl;


	string h = "564.134", k = "783143";
	int k1;
	double h1;
	h1 = convertFromString(h), k1 = convertFromString(k);
	cout << h1 << endl;
	cout << k1 << endl;

	string y, u;
	y = convertToString(h1), u = convertToString(k1);
	cout << y << endl;
	cout << u << endl;

	return 0;
}