转化涉及到的函数说明
1.函数原型:int sprintf(char *string, char *format [,argument,…]);
函数功能:把格式化的数据写入某个字符串缓冲区。将argument数据按照format的格式,写入string中
返回值:如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。
sprintf 返回以format为格式argument为内容组成的结果被写入string的字节数,结束字符‘\0’不计入内。即,如果“Hello”被写入空间足够大的string后,函数sprintf 返回5
参数说明:第2个参数说明
sprintf格式的规格如下所示。[]中的部分是可选的。
%[指定参数][标识符][宽度][.精度]指示符
- [指定参数] 处理字符方向。负号时表示从后向前处理。
- [标识符] 填空字元。 0 的话表示空格填 0;空格是内定值,表示空格就放着。
- [宽度]字符总宽度。为最小宽度。
- [精度] 精确度。指在小数点后的浮点数位数。
- 转换字符
%% 印出百分比符号,不转换。
%c 字符输出到缓冲区,不转换。
%d 整数转成十进位。
%f 倍精确度数字转成浮点数。
%o 整数转成八进位。
%s 字符串输出到缓冲区,不转换。
%x 整数转成小写十六进位。
%X 整数转成大写十六进位。
使用”%d”或者”%x”打印一个字符,便能得出它的10 进制或16 进制的ASCII 码;反过来,使用”%c”打印一个整数,便可以看到它所对应的ASCII字符
sprintf(s, “%8x”, 4567); //小写16 进制,宽度占8 个位置,右对齐
sprintf(s, “%-8X”, 4568); //大写16 进制,宽度占8 个位置,左对齐
sprintf(s, “%08X”, 4567); //产生:“000011D7”
2.函数原型:int sscanf( const char *buffer, const char format, [ argument ] … );
函数功能:sscanf 读取格式化的字符串中的数据。(按format的格式,将buffer中的数据,读取到argument中存放)
返回值:函数将返回成功赋值的字段个数;返回值不包括已读取但未赋值的字段个数。 返回值为 0 表示没有将任何字段赋值。 如果在第一次读取之前到达字符串结尾,则返回EOF。
参数说明:
第二个参数可以是一个或多个 {%[] [width] [{h | I | I64 | L}]type | ’ ’ | ‘\t’ | ‘\n’ | 非%符号}
注:
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 表示满足该条件的被过滤掉,不会向目标参数中写入值
失败返回0 ,否则返回格式化的参数个数
7、如果读取的字符串,不是以空格来分隔的话,就可以使用%[]。
示例:
- 一般用法
char buf[512] ={0} ;
sscanf(“123456 “, “%s”, buf);
printf(”%s\n”, buf);
结果为:123456 - 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。
sscanf(“123456 “, “%4s”, buf);
printf(”%s\n”, buf);
结果为:1234 - 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
sscanf(“123456 abcdedf”, “%[^ ]”, buf);
printf("%s\n", buf);
结果为:123456 - 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
sscanf(“123456abcdedfBCDEF”, “%[1-9a-z]”, buf);
printf("%s\n", buf);
结果为:123456abcdedf - 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
sscanf(“123456abcdedfBCDEF”, “%[^A-Z]”, buf);
printf("%s\n", buf);
结果为:123456abcdedf
6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 “iios/“过滤掉,再将非’@'的一串内容送到buf中
sscanf(“iios/12DDWDFF@122”, “%*[/]/%[@]”, buf);
printf(”%s\n”, buf);
结果为:12DDWDFF - 给定一个字符串"hello, world",仅保留"world"。(注意:“,”之后有一空格)
sscanf(“hello, world”, “%*s%s”, buf);
printf("%s\n", buf);
结果为:world
P.S. %*s表示第一个匹配到的%s被过滤掉,即hello被过滤了,
如果没有空格则结果为NULL。
十进制 <=> 十六进制
int a = 0;
char sHex[10];
memset( sHex, 0x00, sizeof(sHex));
/*十进制转十六进制*/
a = 29;
sprintf( sHex, "%02X", a ); /*sHex的值为:"1D" */
/*十六进制转十进制*/
memset( sHex, 0x00, sizeof( sHex ) );
strcpy( sHex, "2f" );
/*此处注意:第二个参数为%x,不是%d,第三个参数为整形的地址*/
/*按%x十六进制格式,将sHex中的数据,读取到整形变量中*/
sscanf( sHex, "%x", &a ); /*a的值为:47*/
字符串<=> 十六进制
思路:先获取字符串得到每个的字符,根据sprintf( “%2x” )将每个字符转化为十六进制值
char sHex[20+1];
char sStr[10+1];
char sTmp[100];
int i = 0;
memset( sHex, 0x00, sizeof(sHex));
memset( sStr, 0x00, sizeof( sStr ) );
memset( sTmp, 0x00, sizeof(sTmp));
strcpy( sStr, "ab" ); /*字符串按数组形式取对应字符*/
/*一个字符得到对应的2位的十六进制,所以sHex的大小应该是sStr的大小的2倍*/
sprintf( sHex, "%2x", sStr[0] );
for( i = 0; i < strlen(sStr); i++ ){
/*'a'对应的十进制是97,十六进制是61;
‘b’对应的十进制是98,十六进制是62*/
/*%x字符是小写a-f,%X得到的字符为大写A-F*/
sprintf( sTmp, "%02x", sStr[i] ); /*字符转十六进制*/
strcat( sHex, sTmp );
}
printf( "%s", sHex ); /*sHex的值为"6162"字符串*/
字符串<=> 十进制
思路:先获取字符串的每个字符,然后将每个字符通过sprintf( “%d” )获取对应的十进制值
char sHex[20+1];
char sStr[10+1];
char sTmp[100];
int i = 0;
memset( sHex, 0x00, sizeof(sHex));
memset( sStr, 0x00, sizeof( sStr ) );
memset( sTmp, 0x00, sizeof(sTmp));
strcpy( sStr, "ab" ); /*字符串按数组形式取对应字符*/
sprintf( sHex, "%2x", sStr[0] );
for( i = 0; i < strlen(sStr); i++ ){
/*'a'对应的十进制是97,十六进制是61;
‘b’对应的十进制是98,十六进制是62*/
sprintf( sTmp, "%d", sStr[i] ); /*字符转十进制*/
strcat( sHex, " ");
strcat( sHex, sTmp );
}
printf( "%s", sHex ); /*sHex的值为"97 98"字符串*/
字符转十六进制,转十进制,都使用sprintf()函数,只是第二个参数格式变化:十六进制是按%x输入,十进制是按%d输入。第三个参数都是需要转化的字符。