利用C語言實(shí)現(xiàn)將格式化數(shù)據(jù)和字符串相互轉(zhuǎn)換
今天重點(diǎn)介紹2個(gè)函數(shù),分別是sprintf和sscanf,用來將格式化數(shù)據(jù)和字符串相互轉(zhuǎn)換。它們的作用分別是:
1.sprintf函數(shù)用于將格式化數(shù)據(jù)轉(zhuǎn)換成字符串。
3.sscanf函數(shù)用于將字符串轉(zhuǎn)換成格式化數(shù)據(jù)。
接下來是第一個(gè)大問題:我怎么記憶呢?這好容易記反呀!
別擔(dān)心,我來教你。你也許不知道sprintf和sscanf,但你肯定知道printf和scanf。
printf負(fù)責(zé)把格式化數(shù)據(jù)輸出到屏幕上。sprintf和printf類似,只不過不是輸出到屏幕上,而是輸出到一個(gè)字符串中。把格式化數(shù)據(jù)輸出到字符串中,不就是把格式化數(shù)據(jù)轉(zhuǎn)換成字符串嘛。
scanf負(fù)責(zé)從鍵盤中輸入格式化數(shù)據(jù)。同理,sscanf和scanf類似,只不過不是從鍵盤中輸入數(shù)據(jù),而是從一個(gè)字符串中輸入數(shù)據(jù),也就是把字符串轉(zhuǎn)換成格式化數(shù)據(jù)。
接下來講解如何使用這兩個(gè)函數(shù)。
1.sprintf
假設(shè)有這么一個(gè)結(jié)構(gòu)體:
struct S
{
int i;
double d;
char arr[20];
};
我們創(chuàng)建了一個(gè)結(jié)構(gòu)體變量:
struct S s = {10, 3.14, "abcdef"};
此時(shí),內(nèi)存中就有了一份格式化數(shù)據(jù)。我們?nèi)绾伟堰@個(gè)格式化數(shù)據(jù)轉(zhuǎn)換成字符串呢?
首先得有字符串存儲(chǔ)的位置,C語言用字符數(shù)組來存儲(chǔ)字符串:
char str[100] = {0};
接下來我們要干的事情,就是把s結(jié)構(gòu)體中的數(shù)據(jù)轉(zhuǎn)換成字符串,存儲(chǔ)到str中,這就需要使用sprintf。
sprintf的聲明如下:
int sprintf ( char * str, const char * format, ... );
其中str就是轉(zhuǎn)換出來的字符串要存儲(chǔ)到哪(一個(gè)char*的指針),后面的參數(shù)就跟printf是一樣的了。在上面的例子中,應(yīng)該這么使用:
sprintf(str, "%d %lf %s\n", s.i, s.d, s.arr);
如果你還是不理解,可以這么想:下面的代碼是什么意思?
printf("%d %lf %s\n", s.i, s.d, s.arr);
就是把s中的內(nèi)容打印到屏幕上嘛。那如果不是打印到屏幕上,而是“打印”到字符串中,就是sprintf的作用了。
如果你不相信,可以把str中的內(nèi)容打印出來:
printf("%s\n", str);
輸出結(jié)果如下:

這說明轉(zhuǎn)換成功了。
2.sscanf
假設(shè)我們已經(jīng)有一個(gè)字符串了:
char str[] = "10 3.140000 abcdef\n";
其實(shí)這個(gè)字符串和上面的例子中轉(zhuǎn)換出來的字符串是一樣的。
然后創(chuàng)建一個(gè)結(jié)構(gòu)體:
struct S s = {0};
我們?nèi)绾伟堰@個(gè)字符串重新轉(zhuǎn)換成結(jié)構(gòu)體s呢?這就需要用到sscanf函數(shù),聲明如下:
int sscanf ( const char * s, const char * format, ...);
第一個(gè)參數(shù)就是你要轉(zhuǎn)換的字符串,后面的參數(shù)和scanf一樣。
這次,我換一種講述方式,方便大家更好的理解。首先,假設(shè)我要你使用scanf函數(shù)來輸入數(shù)據(jù)到結(jié)構(gòu)體s中,你會(huì)怎么寫?
scanf("%d %lf %s", &s.i, &s.d, s.arr);
注意,數(shù)組名本身就是地址,所以不需要取地址(&)。
scanf函數(shù)可以從鍵盤輸入數(shù)據(jù)到結(jié)構(gòu)體中去,那如果不從鍵盤中輸入,而是從字符串輸入呢?只需要使用sscanf,所有參數(shù)前面加上個(gè)str就行了。
sscanf(str, "%d %lf %s", &s.i, &s.d, &s.arr);
大功告成。你還可以把結(jié)構(gòu)體中的數(shù)據(jù)打印出來:
printf("%d %lf %s\n", s.i, s.d, s.arr);
輸出結(jié)果和上面講解sprintf函數(shù)時(shí)舉的例子的輸出是一樣的。
總結(jié)
1.sprintf和sscanf負(fù)責(zé)將字符串和格式化數(shù)據(jù)相互轉(zhuǎn)換。
2.sprintf相當(dāng)于,本來是printf把格式化數(shù)據(jù)輸出到屏幕上,現(xiàn)在是輸出到一個(gè)字符串中,也就是把格式化數(shù)據(jù)轉(zhuǎn)換成字符串。
3.sscanf相當(dāng)于,本來是scanf從鍵盤中輸入格式化數(shù)據(jù),現(xiàn)在是從一個(gè)字符串中輸入,也就是把字符串轉(zhuǎn)換成格式化數(shù)據(jù)。
4.sprintf和sscanf的參數(shù),與printf和scanf的參數(shù)的區(qū)別是,最前面多了個(gè)char*類型的指針,也就是指向字符串的指針。
到此這篇關(guān)于利用C語言實(shí)現(xiàn)將格式化數(shù)據(jù)和字符串相互轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)C語言格式化數(shù)據(jù)與字符串相互轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ 中"emplace_back" 與 "push_back" 的區(qū)別
這篇文章主要介紹了C++ 中"emplace_back" 與 "push_back" 的區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-04-04
利用C語言實(shí)現(xiàn)單詞文本計(jì)數(shù)
這篇文章主要為大家詳細(xì)介紹了如何編寫一個(gè)C語言程序,用于統(tǒng)計(jì)一個(gè)文本文件中每個(gè)單詞出現(xiàn)的次數(shù),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11
C++構(gòu)造函數(shù)+復(fù)制構(gòu)造函數(shù)+重載等號(hào)運(yùn)算符調(diào)用
這篇文章主要介紹了C++構(gòu)造函數(shù)+復(fù)制構(gòu)造函數(shù)+重載等號(hào)運(yùn)算符調(diào)用,文章敘述詳細(xì),具有一定的的參考價(jià)值,需要的小伙伴可以參考一下2022-03-03
C語言數(shù)據(jù)結(jié)構(gòu)堆的基本操作實(shí)現(xiàn)
這篇文章主要為大家介紹了C語言數(shù)據(jù)結(jié)構(gòu)堆的基本操作實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11

