您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“C語言scanf,fscanf和sscanf有哪些區(qū)別”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
一.scanf,fscanf和sscanf
1.scanf
2.fscanf
3.sscanf
二.printf,fprintf和sprintf
1.printf
2.fprintf
3.sprintf
首先scanf我們的很熟悉,他就是從鍵盤上輸入數(shù)據(jù),準(zhǔn)確的來說就是:
從標(biāo)準(zhǔn)輸入(鍵盤)讀取格式化的數(shù)據(jù)。
int main() { int x = 0; scanf("%d", &x); return 0; }
而fscanf就比scanf高級了一點,可以說是fscanf包含了scanf的功能,對于這個函數(shù)的定義是這樣子的:
從所有的輸入流讀取格式化的數(shù)據(jù)。
我們可以查看一下fscanf-cpulspuls中的解釋和參數(shù):
釋義:從流中讀取數(shù)據(jù),并根據(jù)參數(shù)格式將它們存儲到附加參數(shù)所指向的位置。附加參數(shù)應(yīng)指向格式字符串中的相應(yīng)格式說明符指定的類型已分配的對象。
int fscanf ( FILE * stream, const char * format, ... );
這里的參數(shù)如果看不懂,我們就可以進行對比去學(xué)習(xí),我們可以打開scanf的說明去看一下對比一下:
實際上fscanf就多了一個FILE * 的參數(shù),也就是打開的文件的地址參數(shù),所有當(dāng)我們進行使用的時候,我們可以先像scanf一樣寫出來,然后再在前面加上一個FILE * 的參數(shù)就好了。
例子:
我們可以打開文件,在輸入流中讀取到數(shù)據(jù),然后打印出來看看:
//fscanf struct S { int n; double d; }; int main() { struct S s = {0}; FILE* pf = fopen("data.txt", "r");//文本文件data.txt if (NULL == pf) { perror("fopen"); return -1; } //讀文件 fscanf(pf, "%d %lf", &(s.n), &(s.d)); printf("%d %lf\n", s.n, s.d); //關(guān)閉文件 fclose(pf); pf = NULL; }
老規(guī)矩,我們查一下這個函數(shù)的定義:
這里的意思就是從字符串中讀取到格式化的數(shù)據(jù),也就是說我們輸入進去的數(shù)據(jù),sscanf會轉(zhuǎn)化成字符串的形式。也就是:
從字符串中讀取一個格式化的數(shù)據(jù)。
int sscanf ( const char * s, const char * format, ...);
而對于參數(shù)我們可以再對比一下,前面的fscanf就是多了一個FILE *的指針,而現(xiàn)在這里就是改成了字符指針,也就是從字符指針中讀一個數(shù)據(jù),到后面的格式化數(shù)據(jù)里面去。
例子:
從字符數(shù)組里面拿數(shù)據(jù)進結(jié)構(gòu)體,然后打印出來(這里要先理解下面的sprintf然后一起看):
struct S { int n; double d; char name[10]; }; int main() { char arr[100] = { 0 }; struct S tmp = { 0 }; struct S s = { 100, 3.14, "zhangsan" }; //把一個格式化的數(shù)據(jù)轉(zhuǎn)換成字符串 sprintf(arr, "%d %lf %s", s.n, s.d, s.name); //打印 printf("%s\n", arr); //從arr中的字符串中提取出一個格式化的數(shù)據(jù) sscanf(arr, "%d %lf %s", &(tmp.n), &(tmp.d), tmp.name); //打印 printf("%d %lf %s\n", tmp.n, tmp.d, tmp.name); return 0; }
printf就是一個打印函數(shù),從鍵盤上輸出,對于它來說就是:
把格式化的數(shù)據(jù)到標(biāo)準(zhǔn)輸出(屏幕)上
int main() { int x = 0; printf("%d", x); return 0; }
fprintf同樣是比printf高級一點,它可以輸出到更多的地方,也就是包括著printf的功能,他的定義是:
把格式化的數(shù)據(jù)輸出到所有輸出流(屏幕/文件)上
同樣的我們可以先查一下fprintf - cplusplus:
釋義:將按格式指向的C字符串寫入流。如果格式包括格式說明符(從%開始的子序列),則格式化后的附加參數(shù)將被格式化并插入到結(jié)果字符串中,替換各自的說明符。
int fprintf ( FILE * stream, const char * format, ... );
同樣經(jīng)過對比之后,我們發(fā)現(xiàn)fprintf和printf也就是差了一個FILE *的參數(shù),所以我們同樣可以先按照printf的格式寫,然后再加上參數(shù),就可以很好的使用fprintf了。
例子:
這里將一些值輸出到文件上,也就是當(dāng)我們運行完代碼之后,文件上就會擁有這些數(shù)據(jù):
//fprintf(按某一種格式寫入) struct S { int n; double d; }; int main() { struct S s = { 100, 3.14 }; FILE* pf = fopen("data.txt", "w");//寫入文本文件data.txt if (NULL == pf) { perror("fopen"); return -1; } //寫文件 fprintf(pf, "%d %lf", s.n, s.d); //關(guān)閉文件 fclose(pf); pf = NULL; }
對于ssprintf,還是先看定義:
釋義:在printf上使用格式時,使用相同的文本組成字符串,但內(nèi)容不是打印出來,而是存儲在str指向的緩沖區(qū)中的C字符串中。
實際上這里的意思就是:
把格式化的數(shù)據(jù)輸出轉(zhuǎn)換成字符串。
int sprintf ( char * str, const char * format, ... );
而對于這個函數(shù)參數(shù),我們參照printf轉(zhuǎn)換發(fā)現(xiàn),這里就是多了一個字符指針,也就是從后面的輸出的格式化中讀數(shù)據(jù),到前面的字符指針里面去。然后輸出得到的就是字符串。
例子:
打印結(jié)構(gòu)體的多種類型的數(shù)據(jù):
struct S { int n; double d; char name[10]; }; int main() { char arr[100] = { 0 }; struct S tmp = { 0 }; struct S s = { 100, 3.14, "zhangsan" }; //把一個格式化的數(shù)據(jù)轉(zhuǎn)換成字符串 sprintf(arr, "%d %lf %s", s.n, s.d, s.name); //打印 printf("%s\n", arr); return 0; }
我們以%s打印的,打印出來了:
“C語言scanf,fscanf和sscanf有哪些區(qū)別”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。