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/12DDWDFF@122, 获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中
1
2
sscanf ( "iios/12DDWDFF@122" "%*[^/]/%[^@]" , 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。

猜你喜欢

转载自blog.csdn.net/qq_41843732/article/details/80776930