C語言的標准輸入輸出格式


C語言標准庫概述

  1)庫函數分類
  我們暫時需要記住的有:
    標准輸入輸出函數庫:stdio
    數學應用函數庫:math
    字符串處理函數庫:string
  2)調用函數庫時,我們需要預編譯指令:
    即:

         //或者
         #include"頭文件名"

需要注意的是,第一種寫法,一般在使用標准函數庫時使用,第二種寫法,一般在使用用戶自己定義的函數庫時使用。

格式輸出函數:printf

  1)前言:
    從計算機向外部設備輸出信息稱為輸出,即將計算機內的信息以打印或者存儲的形式轉到終端。
    printf函數在<stdio.h>函數庫中
    預編譯指令為:#include<stdio.h>
  2)標准格式輸出:
    printf("格式輸出控制表列",輸出參數表列);
    格式輸出控制表列包括普通字符和格式字符組成,普通字符如:hello,world;
    格式字符以%開頭,后跟一個字符表示數據類型。如:%d,%f等。
    輸出參數表列在控制表列中如果沒有格式字符,可以省略:如:printf("Hello,world!");
    這里,我們給出兩個實例幫助理解:

      printf("Hello,world!");
      printf("%d",100);
      printf("521%d!",1314);

  3)格式控制符
    在明白輸出函數的基本使用方法后,我們剖析一下格式控制符。
    1、%d格式
      標准輸出函數中以%作為格式輸出控制索引。%d是以十進制在屏幕上顯示輸出參數表列的值。當然輸出參數表列可以為字符型,整型,浮點型等類型,不過最終都以10進制輸出。我們看一個例子:

main()
{
      char c='A';
      int a=1,b=2;
      printf("c=%d,a/b=%d,b/a=%d,(float)a/b=%d",c,a/b,b/a,(float)a/b);
      printf("123.456=%d",123.456);
      printf("%d");
      reeturn 0;
}

最終的輸出結果出乎我們意料,

      c=65,a/b=0,b/a=2,(float)a/b=0
      123.45=446676599
      2367460

  我們在這里解釋一下,首先字符型的'A'在ASICC中的數值是65,所以最終以十進制輸出的是65;由於,a/b的值理應為0.5,在這里,由於是整型輸出,所以小數部分被截斷,最終的結果為0,同理,我們不難理解最后的(float)是什么情況,那么b/a的結果顯然是2,我們不在闡述。下一個輸出,123.456是float類型,不過在C語言中,所有的浮點型都按照double型計算,%d輸出常量123.456在內存中低4字節數據,所以最后結果是446676599,這似乎有點歐亨利結局了,出乎意料卻又在情理之中。最后一個輸出,由於沒有輸出參數表列,所以會輸出一個任意值。
    2、%ld格式
    毫無疑問,%ld中的l是long的簡寫,所以%ld是用來長整型類型輸出的,不過值得注意的是,在32位的操作系統中,int和long型都分配四個字節存儲空間,所以使用%d,%ld無本質區別。
    3、%u格式
    %u用來輸出無符號整型類型,定義為:unsigned int a;
    其中,引入無符號整型的意義就是用在無負數的場景中,以增大int存儲范圍。

      printf("%d",-1);
      printf("%u",-1);

在這個程序中,我們得到的結果是不同的,第一個輸出為-1,第二個輸出為4294967295
解釋一下第二個奇怪的結果,由於負數在計算機內部以補碼形式存在,-1的補碼為0xffffffff,所以在轉換為無符號整型時,符號位被當做數值操作,最終輸出的結果為0xffffffff,換算成十進制為4294967295
    4、%c格式
    %c格式中的c為char類型,所以控制輸出字符型,值得注意的是,在其他類型轉換為char型時,我們關注的該類型的二進制代碼的低八位所代表的的數值(char代表的為0-255)。

      //那如果是負數呢?
      printf("%c,%c",-159,97);

通過運行,我們可以發現,兩個輸出的結果都為c,那這是為什么呢?
我們不妨分析一下-159,和97的區別,發現97+159=256.根據負數在計算機內部存儲的為補碼,我們通過補碼的實質可以發現,-159的補碼等於256對159取余,我們得到了97,由於我們取得是低八位數值,所以自然而然輸出結果為相同的c。

我們給出以下證明:
[-159]原碼=1000 0000 0000 0000 0000 0000 1001 1111
[-159]反碼=1111 1111 1111 1111 1111 1111 0110 0000
[-159]補碼=1111 1111 1111 1111 1111 1111 0110 0001
[97]補碼=0000 0000 0000 0000 0000 0000 0110 0001
於是,去低八位的值是相同的。

    5、%f格式
    %f格式以浮點型輸出,主要用於輸出float和double型,默認輸出小數點后6位數字,不夠6位補零輸出,例如:

      printf("%f,%f",123.456,789);
      //輸出結果為:123.456000,0.000000;

    什么?又被震驚到了,789為什么變成了0.000000?這不柯學,我們分析一下,789在內存中以補碼存在,
其值為:
    [789]補碼=0000 0000 0000 0000 0000 0011 0001 0101
    由於%f以單精度輸出,所以,最高位為符號位,低23位為位數位,中間8位為指數位,所以內存中的數值構成浮點數0.00000000000001100010101*2^0
    加上輸出為7位有效數字,所以最終結果為0.000000,也就不奇怪了。

    6、%e格式
    %e格式以指數形式輸出,指數形式由數符,數值,字符,階符和階碼構成。

正數 負數
數值E 階符 階碼 數符 數值E 階符 階碼

其中,數符用來表示數據的正負,我們在書寫時,需要注意一下格式:

      (+/-)[數字]e(+/-)[數字]的格式書寫
       1e+2,-1e+2,1e-1……

關於指數和float類型,我們后面補充相關指數。

    7、%s格式
    %s格式用來輸出字符串,我們需要注意的有,在輸出時,如果字符串中有轉義字符,會執行這些轉義字符,而%c不會這樣。

      printf("%s","Hello\nwor\0ld");
      /*輸出結果:Hello
                  wor
      */

    8、%o,%x格式,%和\輸出
    這兩個格式不常用,但是我們仍然需要注意,%o以八進制輸出,%x以十六進制輸出.
    而%和\作為控制符,如果我們需要輸出這兩個字符,我們需要在前面重寫一遍該字符

      例如:printf("%%=%d",123);

  4)格式輸出控制字符
    1、%md,%-md,%mc,%-mc格式
    對於這里的m,我們解釋為控制位寬輸出,即用於按指定的寬度m以相應格式輸出數據,其特點如下:
     如果數據位寬大於m,則按實際寬度輸出,如果輸出數據寬度小於m,則左補空格,共輸出m列。
    而‘-’號代表如果數據位寬大於m,則按實際寬度輸出,如果輸出數據寬度小於m,則右補空格,共輸出m列。
    2、%mf,%-mf,%.nf,%m.nf,%-m.nf格式
    對於這里的前兩個與第一種格式相似,我們不在闡述。
    而后面的幾個格式控制表示為:
     %.nf指定小數點后的輸出寬度,當n大於數據有效位數時,右邊補零,當n小於有效位數時,采取四舍五入規則。
     %m.nf,m用於指定整數和小數的總位寬,m大於輸出寬度時,左補空格,m小於輸出寬度時,按實際寬度輸出,n用於指定小數點后的寬度,如果n大於有效寬度,右補零,n小於有效寬度時,按四舍五入規則截取
     我們需要注意的有:我們應首先考慮n的值,即在滿足n的值得基礎上在判斷m對數據輸出的影響,當m小於等於n是,m對輸出數據不起作用,我們舉一個栗子:

      printf("%6.2f,%5.3f,%8.4f",1.234,19.87654,100000.23);
      /*輸出結果為:
      _ _ 1.23,19.877,100000.2300
      */

加上負號代表左對齊.

格式輸入函數

  前言:從輸入設備向計算機輸入數據稱為輸入,我們用標准輸入函數scanf完成。
  格式:一般格式為:scanf("格式輸入控制表列",輸入參數地址表列);
  需要注意的是我們在輸入參數地址表列中書寫的是變量的地址,我們需要使用取地址符完成上述操作.
  eg:scanf("%d",&x);
  scanf的格式控制字符與printf的相似,這里不再一一展開,不過,我們需要闡述一個事實,scanf會產生“歷史遺留問題”;

      scanf("%d",&x);
      scanf("%c",&c);
      printf("%d",c);

  當我們按下回車時,c中是有值得,大家猜一下輸出多少。
  為了避免這種問題,我們常常使用getchar()來消除scanf的遺留問題。
  我們列出一些容易出錯的點:
    1)在讀取字符串時,會在字符串末尾自動添加'\0',所以存儲字符串的字符數組的長度應該為:max(max_strlen_str)+1;
    2)在讀取字符串時,我們不需要添加&,因為字符串的名字本身就是地址常量,后面會有說明。
    3)使用scanf()時,應該遵循寫什么輸入什么的原則,即如果格式輸入控制列表中有空格,那么在讀入數據時應該加上空格,防止讀入錯誤的數據,導致程序報錯。

字符輸入輸出函數

  前言:在stdio庫中,還有兩個字符輸入輸出函數,即getchar和putchar函數。
  putchar的作用是向終端輸出一個字符,其一般格式為:pruchar(c);
  
  這里我們列出一些putchar的常見用法:
    1)輸出字符,可以為變量也可以是常量
    2)可以輸出轉義字符
    3)自動將ASICC碼轉換為字符型輸出

  getchar()的作用是從標准輸入設備中獲取一個字符,
  一般格式為:c=getchar();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM