sscanf和sprintf函数的使用

sscanf和sprintf函数的使用

首先这两个函数是内存函数。
1.sscanf
参数及返回类型

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

我找到sscanf函数的10中用法

#define _CRT_SECURE_NO_DEPRECATE 1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


static void sscanf_test(void)
{
    int ret;
    char *string;
    int  digit;
    char buf1[255];
    char buf2[255];
    char buf3[255];
    char buf4[255];

    //1.最简单的用法
    string = "china beijing 123";
    ret = sscanf(string, "%s %s %d", buf1, buf2, &digit);
    printf("1.string=%s\n", string);
    printf("1.ret=%d, buf1=%s, buf2=%s, digit=%d\n\n", ret, buf1, buf2, digit);
    //
    //执行结果:
    //1.string=china beijing 123
    //1.ret=3, buf1=china, buf2=beijing, digit=123
    //可以看出,sscanf的返回值是读取的参数个数
    //  

    //2.取指定长度的字符串
    string = "123456789";
    sscanf(string, "%5s", buf1);//把字符串string截取五位放在数组buf1中
    printf("2.string=%s\n", string);
    printf("2.buf1=%s\n\n", buf1);
    //
    //执行结果:
    //2.string=123456789
    //2.buf1=12345
    //  

    //3.取到指定字符为止的字符串
    string = "123456";
    sscanf(string, "%[^4]", buf1);
    printf("3.string=%s\n", string);
    printf("3.buf1=%s\n\n", buf1);
    //
    //执行结果:
    //3.string=123456
    //3.buf1=123
    //  

    //4.取到指定字符集为止的字符串
    string = "123abcABC";
    sscanf(string, "%[^A-Z]", buf1);
    printf("4.string=%s\n", string);
    printf("4.buf1=%s\n\n", buf1);
    //
    //执行结果:
    //4.string=123abcABC
    //4.buf1=123abc
    //  

    //5.取仅包含指定字符集的字符串
    string = "0123abcABC";
    sscanf(string, "%[0-9]%[a-z]%[A-Z]", buf1, buf2, buf3);
    printf("5.string=%s\n", string);
    printf("5.buf1=%s, buf2=%s, buf3=%s\n\n", buf1, buf2, buf3);
    //
    //执行结果:
    //5.string=012abcABC
    //5.buf1=123, buf2=abc, buf3=ABC
    //  

    //6.获取指定字符中间的字符串
    string = "ios<android>wp7";
    sscanf(string, "%*[^<]<%[^>]", buf1);
    printf("6.string=%s\n", string);
    printf("6.buf1=%s\n\n", buf1);
    //
    //执行结果:
    //6.string=ios<android>wp7
    //6.buf1=android
    //  

    //7.指定要跳过的字符串
    string = "iosANDandroid";
    sscanf(string, "%[a-z]AND%[a-z]", buf1, buf2);
    printf("7.string=%s\n", string);
    printf("7.buf1=%s, buf2=%s\n\n", buf1, buf2);
    //
    //执行结果:
    //7.string=iosANDandroid
    //7.buf1=ios, buf2=android
    //  

    //8.分割以某字符隔开的字符串
    string = "android-iphone-wp7";
    //
    //字符串取道'-'为止,后面还需要跟着分隔符'-',
    //起到过滤作用,有点类似于第7点
    //  
    sscanf(string, "%[^-]-%[^-]-%[^-]", buf1, buf2, buf3);
    printf("8.string=%s\n", string);
    printf("8.buf1=%s, buf2=%s, buf3=%s\n\n", buf1, buf2, buf3);
    //
    //执行结果:
    //8.string=android-iphone-wp7
    //8.buf1=android, buf2=iphone, buf3=wp7
    //  

    //9.提取邮箱地址
    string = "Email:[email protected]";
    sscanf(string, "%[^:]:%[^@]@%[^.].%s", buf1, buf2, buf3, buf4);
    printf("9.string=%s\n", string);
    printf("9.buf1=%s, buf2=%s, buf3=%s, buf4=%s\n\n", buf1, buf2, buf3, buf4);
    //
    //执行结果:
    //9.string = Email:[email protected]
    //9.buf1=Email, buf2=beijing, buf3=sina, buf4=com.cn
    //  

    //10.过滤掉不想截取或不需要的字符串--补充,
    //在%号后面加一*号,代表过滤这个字符串,不读取
    //  
    string = "android iphone wp7";
    sscanf(string, "%s %*s %s", buf1, buf2);
    printf("10.string=%s\n", string);
    printf("10.buf1=%s, buf2=%s\n\n", buf1, buf2);
    //
    //执行结果:
    //10.string=android iphone wp7
    //10.buf1=android, buf2=wp7
    //  
}

int main()
{
    sscanf_test();
    return 0;
}

2.sprintf
在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望。sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致sprintf 比printf 有用得多。
(1)、定义

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

sprintf 是个变参函数,除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数。
(2)、用途



#define _CRT_SECURE_NO_DEPRECATE 1
#include "stdio.h"

void sprintf_test()
{
    char s[255];


    //用途一
    //sprintf 最常见的应用之一莫过于把整数打印到字符串中,所以spritnf在大多数场合可以替代itoa。
    int a = 123;
    sprintf(s, "%d", 123);
    printf("1.s=%s\n", s);

    //执行结果
    //1.s=123


    //用途二
    //连接字符串,sprintf 的格式控制串中既然可以插入各种东西,并最终把它们“连成一串”,
    //自然也就能够连接字符串,从而在许多场合可以替代strcat,但sprintf 能够一次连接多个字符串
    //(自然也可以同时在它们中间插入别的内容,总之非常灵活)。
    //例如

    char* arr1 = "I";
    char* arr2 = "CSDN";
    sprintf(s, "%s LOVE %s", arr1, arr2);
    printf("2. s=%s\n", s);

    //执行结果
    //2. s=I LOVE CSDN


    //用途三
    //打印地址信息
    int i = 2;
    sprintf(s, "%p", &i);
    printf("3. s=0X%X\n", s);

    //执行结果
    //3. s=0XF7FB2C
}




int main()
{
    sprintf_test();
    return 0;
}

(3)、返回值


//较少有人注意printf / sprintf 函数的返回值,但有时它却是有用的,spritnf 返回了
//本次函数调用最终打印到字符缓冲区中的字符数目。也就是说每当一次sprintf函数调用结
//束以后,你无需再调一次strlen函数便已经知道字符串长度。如:

#define _CRT_SECURE_NO_DEPRECATE 1
#include "stdio.h"

void sprintf_test()
{
    char s[255];
    char* arr = "asdff";
    int len = sprintf(s, "%s", arr);//字符串长度
    printf("%d\n", len);
}

void sprintf_test1()
{
    char s[255];
    int i = 700;
    int len = sprintf(s, "%d", i);//计算整形700的长度
    printf("%d\n", len);

}


int main()
{
    sprintf_test();
    sprintf_test1();
    return 0;
}

//运行结果
//5
//3

猜你喜欢

转载自blog.csdn.net/yulong__li/article/details/81513566