一、標準輸出printf
標頭檔案: stdio.h
原型: int printf(const char *format, ...);
引數:
format: 格式控制字串
...: 可變引數列表
返回值:輸出字元的數量。
注意點:
對於標準輸出printf,我們需要注意的是返回值,很多人會忽略返回值的型別和代表的含義。
二、標準輸入scanf
標頭檔案:stdio.h
引數:format:格式控制字串
...:可變引數列表
返回值:成功讀入的引數個數
注意點:
1)分隔符,scanf中,缺省會把空格,回車換行,tab字元當成是分隔符,對格式控制字串分隔稱子串來並與後面的可變引數列表進行匹配,如果需要修改分隔符,需要用正規表示式來指定。
2)返回值,scanf函式的返回值表示成功讀入的引數的個數,型別為int型。
三、例程
1,請使用printf函式,求解乙個數字n的十進位制表示的數字位數
12 #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**。
12 #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解決這個問題。
12 #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一直存在緩衝區的問題。
12 #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 比如在開啟命令行時,預設情況下,命令列的標準輸入連線到鍵盤,標準輸出和標準錯誤都連線到螢幕,儘管三個流都開啟,但他會根據需要...