天天看點

CString轉換到char*以及CString類下的函數sscanf_s用法

第一部分  CString轉換到char*

方法一:如果你的項目使用的是多位元組字元集(項目-配置屬性-正常-字元集),那麼 CString與char*是可以直接轉換的,可以用=來做值傳遞,在函數之間的作參數傳遞也是沒有差別的。那麼也就是說,如果你的項目使用的是Unicode字元集程式設計,那麼最簡單的方法就是改用多位元組字元集;

下面插入一點多位元組字元集與Unicode字元集的概念,與解決問題無關。多位元組字元集英文簡寫為MBCS,一個英文字元1個位元組8位,一個中文字元2個位元組2*8位,它的弊病就是占用一個位元組和兩個位元組的各國語言混合在一起的時候使用不便,如字元串“你好 kjh”,字元數為5,而位元組數是8(最後還有一個\0),對于用++或--運算符來周遊字元串的程式員來說簡直是噩夢。Unicode通常用兩個位元組表示一個字元,Unicode是後出來的東西,現在的資料類型以及API函數都分為多位元組字元版和寬字元版本,Unicode的制定,國際組織想要容納世界上所有文字和符号的字元編碼方案。

方法二:在使用Unicode字元集時,既然CString無法直接轉換到char*(截止本文章發出筆者沒有找到很好的轉換方法),那麼就這樣處理:先将CString轉換到string,再将string轉換為char*;格式如下

CString a=_T("good123");

string b(CW2A(a.GetString()));//以上是CString轉換到string,那麼至此b的内容就是good123

char *c=b.c_str();//至此c的内容就是good123,char類型哦

第二部分  函數sscanf_s用法

const char *a="我愛你1994CHINA";

int m_NumYear;

sscanf_s(charTemp, "我愛你%dCHINA", &m_NumYear;//取出1994整型數字存進m_NumYear

我個人使用sscanf_s時一定會将函數第二個參數按照待取字元串的順序填滿,或者偷懶一點不填最後的CHINA,但我要取的1994數字前面的“我愛你"絕對不能省,因為函數sscanf_s是從字元串的最左邊開始周遊的,第二個參數的第一個字元與待取字元串的第一個字元一旦對不上,就會立刻傳回0停止周遊;

sscanf_s類似sscanf函數,在其他地方摘錄了一些關于過濾器的格式:

1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳過此資料不讀入. (也就是不把此資料讀入參數中) 

  2、{a|b|c}表示a,b,c中選一,[d],表示可以有d也可以沒有d。 

  3、width表示讀取寬度。 

  4、{h | l | I64 | L}:參數的size,通常h表示單位元組size,I表示2位元組 size,L表示4位元組size(double例外),l64表示8位元組size。 

  5、type :這就很多了,就是%s,%d之類。 

  6、特别的:%*[width] [{h | l | I64 | L}]type 表示滿足該條件的被過濾掉,不會向目标參數中寫入值 

應用執行個體

(以下摘自百度百科https://baike.baidu.com/item/sscanf/10551550?fr=aladdin)

1、一般用法

1 2 3

char

buf[512] = ;

sscanf

(

"123456 "

"%s"

, buf);

printf

(

"%s\n"

, buf);

結果為: 123456

  2. 取 指定長度的字元串。如在下例中,取最大長度為4位元組的字元串。

1 2

sscanf

(

"123456 "

"%4s"

, buf);

printf

(

"%s\n"

, buf);

結果為: 1234

  3. 取到 指定字元為止的字元串。如在下例中,取遇到空格為止字元串。

1 2

sscanf

(

"123456 abcdedf"

"%[^ ]"

, buf);

printf

(

"%s\n"

, buf);

結果為: 123456

  4. 取 僅包含指定字元集的字元串。如在下例中,取僅包含1到9和小寫字母的字元串。

1 2

sscanf

(

"123456abcdedfBCDEF"

"%[1-9a-z]"

, buf);

printf

(

"%s\n"

, buf);

結果為: 123456abcdedf

  5. 取到 指定字元集為止的字元串。如在下例中,取遇到大寫字母為止的字元串。

1 2

sscanf

(

"123456abcdedfBCDEF"

"%[^A-Z]"

, buf);

printf

(

"%s\n"

, buf);

結果為: 123456abcdedf

  6、給定一個字元串iios/[email protected], 擷取 / 和 @ 之間的字元串,先将 "iios/"過濾掉,再将非'@'的一串内容送到buf中

1 2

sscanf

(

"iios/[email protected]"

"%*[^/]/%[^@]"

, buf);

printf

(

"%s\n"

, buf);

結果為: 12DDWDFF

  7、給定一個字元串 "hello, world",僅保留"world"。(注意:“,”之後有一空格)

1 2

sscanf

(“hello, world”, 

"%*s%s"

, buf);

printf

(

"%s\n"

, buf);

結果為: world

   P.S. %*s表示第一個比對到的%s被過濾掉,即hello被過濾了,

  如果沒有空格則結果為NULL。

繼續閱讀