標準輸出printf與標準輸入scanf

2022-05-01 14:54:13 字數 3021 閱讀 9569

一、標準輸出printf

標頭檔案: stdio.h

原型: int printf(const char *format, ...);

引數:    

format: 格式控制字串

...: 可變引數列表

返回值:輸出字元的數量。

注意點:

對於標準輸出printf,我們需要注意的是返回值,很多人會忽略返回值的型別和代表的含義。

二、標準輸入scanf

標頭檔案:stdio.h

引數:format:格式控制字串

...:可變引數列表

返回值:成功讀入的引數個數

注意點:

1)分隔符,scanf中,缺省會把空格,回車換行,tab字元當成是分隔符,對格式控制字串分隔稱子串來並與後面的可變引數列表進行匹配,如果需要修改分隔符,需要用正規表示式來指定。

2)返回值,scanf函式的返回值表示成功讀入的引數的個數,型別為int型。

三、例程

1,請使用printf函式,求解乙個數字n的十進位制表示的數字位數

1

2 #include 3

4int main(void) 9

10return0;

11 }

首先,上述**需要注意的點為eof(end of file),linux有一句名言--一切皆檔案,對於二進位制值eof,表示的是檔案結尾,對於標準輸入而言,就是輸入已經到達結尾,在linux中我們用ctrl+d表示eof,window為ctrl+z。

ydq@ubuntu:20201013$ gcc 1.test.c

ydq@ubuntu:20201013$ ./a.out

1234

1234 has 4 digits!                --》如果想結束輸入,可以按下鍵盤ctrl+d表示輸入結束(eof)。

ydq@ubuntu:20201013$

現在1.test.c就是用來測printf返回值的**,通過執行結果我們可以知道printf函式返回值就是代表輸出的字元數量。

2.請寫乙個程式,讀入一行字串(可能包含空格),輸出這個字串(可能包含空格),輸出這個字串中字元的數量。

例如輸入:hello world!

輸出:hello world!

首先我們給出version1**。

1

2 #include 3

4int main(void

) ;6

while (scanf("

%s", str) !=eof)

9return0;

10 }

ydq@ubuntu:20201013$ g++ 2.test_version1.c

ydq@ubuntu:20201013$ ./a.out   

hello world!

str: hello

str: world!

ydq@ubuntu:20201013$

第乙個版本,我們執行出來的結果是分開的兩個字串,分別為hello和world!,在這裡就是預設分隔符起的作用,所以我們得在version2解決這個問題。

1

2 #include 3

4int main(void

) ;6

while (scanf("

%[^\n]s

", str) != eof)

9return0;

10 }

ydq@ubuntu:20201013$ ./a.out > output.txt

hello world!

^c在這裡我們把輸出結果重定向到檔案output.txt,再通過vim命令去開啟該檔案檢視它裡面的內容。

ydq@ubuntu:20201013$ vi output.txt

1 str: hello world!, ret = 1

2 str: hello world!, ret = 0

3 str: hello world!, ret = 0

4 str: hello world!, ret = 0

5 str: hello world!, ret = 0

6 str: hello world!, ret = 0

7 str: hello world!, ret = 0

8 str: hello world!, ret = 0  --》不止怎麼多行,檔案接下來有很多行。

首先ret是scanf的返回值,這裡我們第一次就已經成功把hello world!讀入並賦值到str陣列中,其中返回值為0,接下來scanf還是一直返回0,表示成功讀入0個引數,這時候是不是很奇怪,其實在標準輸入和標準輸入有緩衝區的概念,首先我們在鍵盤輸入的字串hello world!最先開始的時候是儲存到輸入緩衝區,當遇到是遇到換行符或緩衝區滿之後或程式結束後才輸出緩衝,當我們在鍵盤輸入hello world!跟回車\n的時候,這些字串首先會被存入到輸入緩衝區中,而由於我們在格式控制字串中指定[^\n](除了換行符之外,其他字元全部輸入),在緩衝區中,只能成功讀出緩衝區的hello world!賦值給str,而\n永遠都存在緩衝區中,只要緩衝區中有資料,scanf函式就會一直會返回。接下來我們會給出version3,解決\n一直存在緩衝區的問題。

1

2 #include 3

4int main(void

) ;6

intret;

7while ((ret = scanf("

%[^\n]s

", str)) != eof)

11return0;

12 }

這裡,我們呼叫getchar()函式,強制從緩衝區中讀出乙個字元,這樣就可以解決\n一直存在輸入緩衝區的情況了。

ydq@ubuntu:20201013$ ./a.out

hello world!

str: hello world!, ret = 1

ydq@ubuntu:20201013$

至此,我們version3版本已經可以完成題目的要求。

標準輸入與標準輸出

輸入cat 命令時,他會從stdin 對通斷介面來說,標準輸入就是鍵盤 接受輸入,cat testfile 現在cat命令會用testfile檔案中的行為作為輸入,可以使用這種技術將資料輸入到任何能從stdin接受資料的shell命令 stdout 在終端介面上,標準輸出就是終端顯示器。ls l t...

printf 標準輸出

root localhost echo 123456 123456 root localhost echo 1 2 3 4 5 6 按照原格式輸出12 3456 root localhost printf 1 2 3 4 5 6 只輸出了乙個符號,沒有標稱輸出型別 1 root localhost ...

重定向》 與標準輸入 標準輸出 標準錯誤輸出

當linux執行乙個程式的時候,會自動開啟三個流,標準輸入 standard input 標準輸出 standard output 標準錯誤輸出 standard error 比如在開啟命令行時,預設情況下,命令列的標準輸入連線到鍵盤,標準輸出和標準錯誤都連線到螢幕,儘管三個流都開啟,但他會根據需要...