Wednesday, March 21, 2012

char CString 轉換

1、char*轉換成CString
若將char*轉換成CString,除了直接賦值外,還可使用CString::Format進行。例如:

char chArray[] = "This is a test";
char * p = "This is a test";


LPSTR p = "This is a test";
或在已定義Unicode應的用程式中

TCHAR * p = _T("This is a test");


LPTSTR p = _T("This is a test");
CString theString = chArray;
theString.Format(_T("%s"), chArray);
theString = p;
2、CString轉換成char*

若將CString類轉換成char*(LPSTR)類型,常常使用下列三種方法:

方法一,使用強制轉換。例如:

CString theString( "This is a test" );
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;
方法二,使用strcpy。例如:

CString theString( "This is a test" );
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString);
需要說明的是,strcpy(或可移值Unicode/MBCS的_tcscpy)的第二個參數是 const wchar_t* (Unicode)或const char* (ANSI),系統編譯器將會自動對其進行轉換。

方法三,使用CString::GetBuffer。例如:

CString s(_T("This is a test "));
LPTSTR p = s.GetBuffer();
// 在這裏添加使用p的代碼
if(p != NULL) *p = _T('\0');
s.ReleaseBuffer();
// 使用完後及時釋放,以便能使用其他的CString成員函數
3、BSTR轉換成char*

方法一,使用ConvertBSTRToString。例如:

#include
#pragma comment(lib, "comsupp.lib")
int _tmain(int argc, _TCHAR* argv[])
{
BSTR bstrText = ::SysAllocString(L"Test");
char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);
SysFreeString(bstrText); // 用完釋放
delete[] lpszText2;
return 0;
}
方法二,使用_bstr_t的賦值運算符重載。例如:

_bstr_t b = bstrText;
char* lpszText2 = b;
4、char*轉換成BSTR

方法一,使用SysAllocString等API函數。例如:

BSTR bstrText = ::SysAllocString(L"Test");
BSTR bstrText = ::SysAllocStringLen(L"Test",4);
BSTR bstrText = ::SysAllocStringByteLen("Test",4);
方法二,使用COleVariant或_variant_t。例如:

//COleVariant strVar("This is a test");
_variant_t strVar("This is a test");
BSTR bstrText = strVar.bstrVal;
方法三,使用_bstr_t,這是一種最簡單的方法。例如:

BSTR bstrText = _bstr_t("This is a test");
方法四,使用CComBSTR。例如:

BSTR bstrText = CComBSTR("This is a test");


CComBSTR bstr("This is a test");
BSTR bstrText = bstr.m_str;
方法五,使用ConvertStringToBSTR。例如:

char* lpszText = "Test";
BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);
5、CString轉換成BSTR

通常是通過使用CStringT::AllocSysString來實現。例如:

CString str("This is a test");
BSTR bstrText = str.AllocSysString();

SysFreeString(bstrText); // 用完釋放
6、BSTR轉換成CString

一般可按下列方法進行:

BSTR bstrText = ::SysAllocString(L"Test");
CStringA str;
str.Empty();
str = bstrText;


CStringA str(bstrText);
7、ANSI、Unicode和寬字元之間的轉換
方法一,使用MultiByteToWideChar將ANSI字元轉換成Unicode字元,使用WideCharToMultiByte將Unicode字元轉換成ANSI字元。

方法二,使用“_T”將ANSI轉換成“一般”類型字串,使用“L”將ANSI轉換成Unicode,而在託管C++環境中還可使用S將ANSI字串轉換成String*物件。例如:

TCHAR tstr[] = _T("this is a test");
wchar_t wszStr[] = L"This is a test";
String* str = S”This is a test”;
方法三,使用ATL 7.0的轉換宏和類。ATL7.0在原有3.0基礎上完善和增加了許多字串轉換巨集以及提供相應的類,它具有如圖3所示的統一形式:

其中,第一個C表示“class”,以便於ATL 3.0宏相區別,第二個C表示常量,2表示“to”,EX表示要開闢一定大小的緩衝。SourceType和DestinationType可以是A、T、W和OLE,其含義分別是ANSI、Unicode、“一般”類型和OLE字串。例如,CA2CT就是將ANSI轉換成一般類型的字串常量。下面是一些示例代碼:

LPTSTR tstr= CA2TEX<16>("this is a test");
LPCTSTR tcstr= CA2CT("this is a test");
wchar_t wszStr[] = L"This is a test";
char* chstr = CW2A(wszStr);
結語
幾乎所有的程式都要用到字串,而Visual C++.NET由於功能強大、應用廣泛,因而字串之間的轉換更為頻繁。本文幾乎涉及到目前的所有轉換方法。當然對於.NET框架來說,還可使用Convert和Text類進行不同資料類型以及字元編碼之間的相互轉換。

Reference:

這樣的錯誤該如何解決呢?

Saturday, March 17, 2012

從此,沒有藉口不理財 - Cheers快樂工作人雜誌

從此,沒有藉口不理財 - Cheers快樂工作人雜誌

低薪時代,明知理財才是累積財富的正途,但你為何遲遲不行動?

懶惰其實不是真正的原因,最主要的還是心中那一股對投資的擔憂與恐懼。《Cheers》雜誌特別專訪著有《上班可以致富》、《如何規避股市風暴》、《投資股票的第一本書》等暢銷書,並熟悉上班族投資心理的匯豐銀行信託投資分處資深副總裁楊偉凱,歸納出上班族不積極投資的4個原因,幫助你解除心理障礙,重拾投資行動力。

心結1:我不懂!

是否要看得懂技術分析、財務報表,才可以投資?

【行動建議】從大師投資法入手

投資其實不一定需要很高深的知識。尤其本來就不太敢投資的人,千萬不要從看每天的財經新聞著手,因為它們的資訊來源很多,可能會把你搞亂。

股市每天的波動很大,你在報紙上看到的可能已是好幾手的訊息,即使看再多,也不見得會有好的投資報酬。不如先閱讀投資大師級的書,如巴菲特、彼得.林區、德國投資大師安德烈.斯科托蘭尼的書。

他們的投資觀念比較正確,如果在一開始時建立了正確的基本觀念,當你犯第1次錯、第2次錯、第3次錯,你就會歸納出什麼樣的做法才是對的。畢竟每個人都有自己的本業,花太多時間看盤,意義不大。如果真的要投資股票,建議先從龍頭股開始,因為龍頭股的市值比較大,波動相對較小,除非你對產業的景氣循環、上下游關係了解很深,再去考慮比較小的股票。

§

心結2:沒時間

沒時間研究,不知道何時該買,何時該賣?

【行動建議】分散時間點買賣

如果你選擇的投資標的是值得中長期投資的,就不需要每天看盤。如果你要賺的是20%,為什麼要那麼在意今天漲2%、還是跌2%?每天都有市場訊息會導致股票價格波動,只要投資的是長期可成長的基金,每一季找個時間看一次,就可以了。而若有分散時間點買賣,就不太需要擔心時間點選得對不對。

舉例來說,我可能先花些時間研究,認為「南亞」的基本面不錯,在自認為適合的價格先買1張,但它最近受到力霸集團風暴影響稍微跌了一些,但我知道和南亞本身沒有關係的,所以又再買進1張,這樣不但不會感到跌價的壓力,反而會感覺是以更便宜的價格買到,心理狀態就不同。

心結3:怕賠錢!

好不容易存下來的辛苦血汗錢,希望不要被折損!

【行動建議】賠錢要清楚原因

賠錢是很正常的。

不要怕賠錢,因為賠錢換來的經驗,可以幫助你在未來賺到更多錢。但賠錢後最重要的是,要清楚自己失敗的原因是什麼,是標的有問題、時機有問題、還是風險不夠分散?你應該繼續投資,但是要修正你上次的投資方式。

舉例來說,過去台灣股市上萬點的時候,有很多人盲目追高,後來賠了很多錢,紛紛都說以後不投資了,但接下來若又上萬點,他們可能馬上又會充滿信心地衝進來買,這是很可怕的。

§

當然有些人寧可把錢拿去放定存,不想有任何損傷。其實投資1年獲利10%是很容易做到的,風險也不大,如果你選擇沒有任何風險的定存,當然也要接受不投資的財富累積差距(見算式1、2)。

心結4:錢太少!

我一定要累積到一筆大數目,才值得投資?

【行動建議】投資要趁早

每個人一踏入社會、不管錢有多少,就算每個月只有3千元、5千元的餘錢,也一定要開始想辦法投資。要這麼早就開始投資,一是因為投資是靠時間、複利去累積的,你愈早投入的錢,對將來的貢獻度會愈大。

二則是因為要趁投資金額較小時,盡早訓練自己的理財EQ。即使你每個月只用3千元定期定額投資基金,你會看到自己投資5個月,漲了8%,過了一段時間又跌到2%,後來又漲到15%,你就會對投資的標的有感覺,也會訓練出自己的理財EQ。就像小的時候學游泳,愈不怕被水嗆,學得愈快。

投資的經驗愈多,自己對風險的警覺度會愈高,做決策的穩定度也會更強。一般來講,隨著年紀增長,手上的資金會累積得更多,所以投資時會更緊張,做錯決策也會影響更大,所以更要從小錢開始磨練。

算式1

5年買台塑,賺進小March

本金343,000元(2002年1月初買進台塑股票10張的價格)

投資台塑股票:5年後

§

從此,沒有藉口不理財

配股加股息13,490股╳股價54.1元(2006年年底股價)=744,300元

獲利:401,300元

放銀行定存:5年後

本金╳利息2%=371,274元

獲利:28,274元

算式2

每月存1萬元,基金、定存大不同

5年

本金(元):600,000

銀行定存報酬率2%:630,474

投資基金報酬率10%:774,371

相差金額:約14萬元

10年

本金(元):1,200,000

銀行定存報酬率2%:1,327,197

投資基金報酬率10%:2,048,450

相差金額:約72萬元

##HIDEME##