天天看點

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[];
    char buf2[];
    char buf3[];
    char buf4[];

    //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 ;
}
           

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[];


    //用途一
    //sprintf 最常見的應用之一莫過于把整數列印到字元串中,是以spritnf在大多數場合可以替代itoa。
    int a = ;
    sprintf(s, "%d", );
    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 = ;
    sprintf(s, "%p", &i);
    printf("3. s=0X%X\n", s);

    //執行結果
    //3. s=0XF7FB2C
}




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

(3)、傳回值

//較少有人注意printf / sprintf 函數的傳回值,但有時它卻是有用的,spritnf 傳回了
//本次函數調用最終列印到字元緩沖區中的字元數目。也就是說每當一次sprintf函數調用結
//束以後,你無需再調一次strlen函數便已經知道字元串長度。如:

#define _CRT_SECURE_NO_DEPRECATE 1
#include "stdio.h"

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

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

}


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

//運作結果
//5
//3
           

繼續閱讀