sprintf 和 sscanf 详细解读(有可运行代码)


sprintf

//sprintf( 目标,格式,原来的数据)//可以把好多 数据都格式化到同一个目标中

//sprintf函数的格式: 最前面是 char 型的字符串,头文件是 #include <stdio.h>

// int sprintf( char *buffer, const char *format [, argument,...] );


#include <cstdio> //测试正确

int main()

{

    char s[20];

     //意思是,把 十进制数 转换成 8 进制数,存到字符串 是 中

    sprintf(s, "%08X", 4567); //产生:"000011D7"   //位数不够的话,在前面补 0

    printf("%s\n",s);

    sprintf(s, "%8d", 4567); //产生:"    4567"    //不够的话,补充空格(默认	右对齐)

    printf("%s\n",s);

    sprintf(s, "%-8d%8d", 4567,1236); //产生:"4567      1236"   //( - 号,	左对齐)

    printf("%s\n",s);

     //这儿的 s 会自动更新值

    sprintf(s, "%.3f", 3.1415626); //产生:" 3.142"

    printf("%s\n",s);

/*******************************************************************/

    char s1[]= {'A','B','C','D','E'};

    char s2[]= {'Q','W','E','R','T','Y'};

    sprintf(s,"%8.2s",s1);  //产生"      AB"(先从原来 s1 中取出2个字符,2	<8,所以前面补充6个空格)

    printf("%s\n",s);

    sprintf(s,"%.4s%.3s",s1,s2); //产生”ABCDQWE”

    printf("%s\n",s);

    sprintf(s, "%.*s  %.*s", sizeof(s1), s1, sizeof(s2), s2); //产生”ABCDE  QWERTY”

     //如果 ""里面有空格,则空格也被 格式化进入 目标串中

    printf("%s\n",s);

 /*******************************************************************/

     /*sprintf(s, "%s%s",s1,s2); //直接这样连接字符串 不行*/

    int i = 100;

    sprintf(s,"%.2f",(double)i);   //输出”100.00”

    printf("%s\n",s);

    sprintf(s,"%p",&i);   //输出”0028fee8”

    printf("i 的内存地址是 %s\n",s);

//对字符串进行连接(可以多个字符串,也可以中间添加), 

//效率比strcat 高

    char who[] = "I";   //其实用 char *who = "I" 也行

    char vv[] = "very";

    char whom[] = "CSDN";

    int len = sprintf(s, "%s %s love %s.", who,vv,whom); //产生:"I very love CSDN. "

    printf("%s\n",s);

     //sprintf的返回值是字符数组中字符的个数,

     //即字符串的长度,不用在调用strlen(s)求字符串的长度。

    printf("字符串s 的长度(空格也计数)是%d\n",len); //产生”12”

    return 0;

}


sscanf

//sscanf( 原来的数据,格式,目标) //可以把一个数据分解到多个目标中

#include <cstdio>   //测试正确

#include <cstring>

int main()

{

    int a,b,c;

    sscanf("2008:  03:  18","%d:%d:%d",&a,&b,&c);//注意,这儿要取 &

    printf("%d %d %d\n",a,b,c); //产生”2008 3 18”

    char buf[512];

    sscanf("123456(空格) asdf", "%s", buf);   //读取的时候,buf 自动清	空

    printf("%s\n", buf); //产生”123456”

    // cout<<buf<<endl;    //在C++中,这样竟然也能输出

    sscanf("123456 ", "%4s", buf);

    printf("%s\n",buf); //产生”1234”

/*******************************************************************/

    sscanf("1234abMNB","%[^N]",buf);    //取到字符'N'的时候停止(不包含N)

    printf("%s\n",buf); //产生”1234abM”

 

    sscanf("123456abcdMNB","%[1-9a-z]",buf); //只读取数字和小写字母(遇到	其他字母或者字符,停)

    printf("%s\n",buf);  //产生”123456abcd”

 

    sscanf("123456abBCDEF", "%[^A-Z]", buf);

    printf("%s\n",buf); //产生”1234ab”

    sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);  //把两个字符之间	的内容读取出来

    printf("%s\n", buf); //产生”12DDWDFF”

 

    sscanf("aidc#ad","%[^#]",buf);

    printf("%s\n",buf);  //产生”aidc”

/*******************************************************************/

    sscanf("hello, world", "%*s%s", buf);   //以空格间隔,*的内容被过滤	掉

    printf("%s\n",buf);  //产生”world”

    sscanf("12345acc","%*d%s",buf); //5后面,有空格也行

    printf("%s\n",buf);  //产生”acc”

    /*******************************************************************/

    char t1[100],t2[100];

    sscanf("2006:03:18 - 2008:04:18", "%[0-9,:] - %[0-9,:]",t1, t2);

     printf("%s %s\n",t1,t2); //产生”2006:03:18 - 2008:04:18”

 

    char str[100] ="123568qwerSDD!!AE";

        char lowercase[100];

    double num;

    sscanf(str,"%d%[a-z&&A-Z]", &num, lowercase);

    printf("The number is: %d.\n", num); //产生”123568”

    printf("The lowercase is: %s.", lowercase);   //产生”qwerSDD”

  /***************************************************************/

    double D=1.23;

    char s5[]="adadfagag  876.52344  aaaabbb";

    sscanf(s5,"%*s%lf",&D); // char to double(字符串转为 double类型)

    printf("%.4f\n",D); //产生”876.5234” 自动的进行四舍五入

    D = D + 100;

    printf("%.4f\n",D); //产生”976.5234”

    return 0;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值