1. 程式人生 > >C語言(三)---輸入和輸出

C語言(三)---輸入和輸出

而是 abs 空間 精度 保存 括號 ger 原型 parameter

一、輸出

  輸入輸出:英文是Input/Output簡稱IO。

  C語言標準函數庫中,提供了關於以下介紹的幾種輸出函數,(所有標準輸入輸出函數在調用前,必須先包含頭文件stdio.h)

1.1 簡單字符輸出

1.1.1 putchar函數

  putchar函數:將指定的(表達式的值所對應的)字符輸出到標準輸出終端(屏幕)上。

  格式:int putchar( int c );

  返回值:返回已寫好的字符。 若要指示錯誤或文件結尾條件,putchar 返回 EOF;

  例如:putchar(‘a’+3);打印的結果是d,是一個字符而不是數值。

  a的ASCII碼是97,加3是ASCII碼表中100對應的字符就是d。

  例如:putchar(99);打印的結果是c,代入一個數字打印出的是一個字符。

  就如同代入的是學號,打印出來的是姓名一樣。

1.1.2 putc函數

  putc函數:將指定的字符輸出到指定標準輸出流(屏幕或一個文件)中。

  格式:int putc( int c, FILE *stream ); 

  c 要寫入的字符。
  stream 指向 FILE 結構的指針。
  返回值:返回已寫好的字符。若要指示錯誤或文件結尾情況,putc 返回 EOF;

  等價關系:putc的功能中包含putchar的功能。

  putchar(c)等價於putc(c,stdout)。

  例如:putc(‘A’,stdout)等價於putchar(‘A’)

1.1.3 fputc函數

  • 函數原型:int fputc( int c, FILE *stream );
  • 參數:
    • c:要寫入的字符。
    • stream指向 FILE 結構的指針。
  • 返回值:返回一個寫好的字符。EOF 的返回值指示錯誤
  • putc等效,但是僅實現為函數,而不是函數和宏。

1.2 多種格式輸出

1.2.1 printf函數

  c語言中格式化輸出的函數,用於向終端(屏幕)要輸出的的各種類型的數據的常量或變量,除了可以輸出字母、數字、空格和一些數字符號以外,還可以使用一些轉義字符表示特殊的含義。

  格式:int printf( const char *format [, argument]... );

    技術分享

  • printf函數打印時的占位控制:
    • 在printf函數的控制串內,%符號與控制符之間的數字是用來控制占位的。例如:printf(“%8.3f”,34.678f);8代表包括小數點總共占用8個空位,.3代表保留3位小數打印。
    • %之後帶-符號代表在所占用的空間內左對齊,缺省不帶-符號是右對齊。例如:printf(“價格=%-8.3f”,34.67f);還是占用8個空位但是,與前面不同之處是左對齊。
    • 如果%後面是0.x代表不占用多余空位,只控制保留的小數位。例如:printf(“價格=%0.3f”,34.6f);以上是printf函數對於浮點數的占位和對其管理。
    • 對於整數和字符串輸出只有占位控制和對齊控制,沒有小數點後面的控制。例如:printf(“學號:%-8d姓名:%-10s\n”);8和10代表的是占位管理,-符號代表左對齊,缺省不帶-符號是右對齊。

  printf 類型字段字符:

類型字符

參數

輸出格式

c

字符

printf 函數一起使用時,指定單字節字符;與 wprintf 函數一起使用時,指定寬字符。

C

字符

printf 函數一起使用時,指定寬字符;與 wprintf 函數一起使用時,指定單字節字符。

d

Integer

帶符號十進制整數。

i

Integer

帶符號十進制整數。

o

Integer

無符號八進制整數。

u

Integer

無符號十進制整數。

x

Integer

無符號十六進制整數;使用“abcdef.”

X

Integer

無符號十六進制整數;使用“ABCDEF.”

e

浮點

有符號的值,形式為 [ – ]d .dddd e [ sign]dd[d],其中 d 是一個十進制數,dddd 是一個或多個十進制數,dd[d] 是兩三個十進制數,具體取決於 輸出格式和指數大小,並且 符號為 + 或 –。

E

浮點

e 格式相同,除非 E(而非 e)引入了指數。

f

浮點

有符號的值,形式為 [ – ]dddd .dddd,其中 dddd 是一個或多個十進制數。 小數點前的數字位數取決於數字的度量值,小數點後的數字位數取決於所需精度。

g

浮點

有符號的值顯示為 f 或 e 格式,取其中對於給定的值和精度更為精簡一個。 僅當值的指數小於 -4 或大於等於 precision 參數時,使用 e 格式。 截去尾隨零,僅當後跟一個或多個數字時,才會顯示小數點。

G

浮點

g 格式相同,除非 E(而非 e)引入指數(如果適用)。

a

浮點

有符號十六進制雙精度浮點值,形式為 [?]0x h.hhhh dd,其中 h.hhhh 是尾數的十六進制數(使用小寫字母),dd 是指數的一個或多個數字。 精度指定此點後的數字位數。

A

浮點

有符號十六進制雙精度浮點值,形式為 [?]0X h.hhhh dd,其中 h.hhhh 是尾數的十六進制數(使用大寫字母),dd 是指數的一個或多個數字。 精度指定此點後的數字位數。

n

指向整數的指針

目前成功寫入流或緩沖區的字符數。 此值存儲在地址作為參數的整數中。 請參閱下文中的安全說明。

p

指針類型

將參數顯示為十六進制數中的地址。

s

字符串

printf 函數一起使用時,指定單字節或多字節字符串;與 wprintf 函數一起使用時,指定寬字符字符串。 於第一個空字符之前或達到 precision 值之前,顯示字符。

S

字符串

printf 函數一起使用時,指定寬字符字符串;與 wprintf 函數一起使用時,指定單字節或多字節字符串。 於第一個空字符之前或達到 precision 值之前,顯示字符。

Z

ANSI_STRING 或 UNICODE_STRING 結構

技術分享ANSI_STRING 的地址或 技術分享UNICODE_STRING 結構作為參數傳遞時,顯示包含在緩沖區中的字符串(此結構的 Buffer 字段指向此緩沖區)。 使用 w 的長度修飾符前綴指定 UNICODE_STRING 參數,例如 %wZ。 結構的 Length 字段必須設置為字符串的長度(以字節為單位)。 結構的 MaximumLength 字段必須設置為緩沖區的長度(以字節為單位)。

通常情況下,Z 類型字符僅在使用格式規範(如 dbgPrint 和 kdPrint)的驅動程序調試函數中使

二、輸入

2.1 多種格式輸入---scanf函數

  scanf函數:格式化輸入函數,即按控制字符串內指定的各種格式,從鍵盤上把數據輸入到指定的變量之中。

  格式:int scanf( const char *format [,argument]... );

    format窗體控件字符串。

    argument可選參數。

    返回成功轉換和賦值的字段數;返回值不包括讀取,但未賦值的字段。 返回值為 0 表示未分配字段。

  • 與printf相同之處是:
    • 控制字符串內的每個%後面必須跟一個控制字符,參數列表中的參數都必須與控制字符的個數和類型相匹配
  • 與printf的不同之處是:
    • scanf的參數列表中,每一個變量之前都必須要帶上取地址符號(&)。代表要將參數列表中所有變量的地址一一傳遞給系統,操作系統要按照給定變量的地址,將用戶輸入的數據傳遞給參數列表中每一個對應的變量。(只有數組變量可以不用取地址,因為數組變量自身就是一個內存地址。printf的參數列表中,所有變量是不用取地址直接代入的。如果scanf函數像直接代入變量不取地址,執行時會因數據送錯地址造成整個程序崩潰。
    • scanf的控制字符串內除了控制字符以外,只能指定間隔符空格或逗號。不能像printf函數那樣,隨意在控制字符之間夾雜其他的文字。

  技術分享

2.2 字符輸入

2.2.1 getc

  getc函數:int getc( FILE *stream );

  stream  輸入流。

  返回值:返回讀取的字符。若要指示讀取錯誤或文件結束的條件,getc 返回EOF

2.2.2 getchar

  getchar函數:從stdio流中讀字符,它從標準輸入裏讀取下一個字符。
  格式:int getchar(void);

  int c = getchar();

  等價於:int c=getc(stdin)
  也等價於:int c;scanf(“%c”,&c);

  以上三中形式單獨調用時,最好在之前調用一個函數來清理輸入流:fflush(stdin);否則,可能獲取不到新輸入的內容,而是獲得了上一次輸入時的回車符。

三、字符串輸入輸出

3.1輸入函數

3.1.1 gets 函數

  gets函數:從stdin流中讀取字符串,類似於scanf(“%s”,&x);

  • 函數原型:char *gets( char *buffer );
  • 參數:buffer   輸入字符串的存儲位置。
  • 返回值:如果成功,返回參數。錯誤返回NULL
  • gets 函數從標準輸入流 stdin 中讀取一行並保存在 buffer中. 行包含所有字符模式將匹配第一個換行符 (“\n”)。 gets 在返回行之前使用 null 字符 (“\0 ")然後替換換行符。相反,fgets 函數保留換行符。

3.1.2 fgets 函數

  • 函數原型:char *fgets( char *str, int n, FILE *stream );
  • 參數:
    • str:數據的存儲位置
    • n:要讀取的最大字符數
    • stream:指向FILE結構的指針
  • 返回值:成功,返回打印出的字符串;失敗返回NULL    

  fgets 函數讀取輸入 stream 參數的字符串並將其存儲到 str中。 fgets 讀取從當前流位置的字符,並且包括第一個字符,到流的末尾,或直至讀取字符數 - 1 與 n 相等。 存儲在 str 中追加 null 字符。 如果讀取,換行字符包括在字符串中。

3.2 輸出函數

3.2.1 puts函數

  • puts函數:用來向標準輸出設備寫字符串並換行,類似於printf(“%s\n”,x);
  • 函數原型:int puts( const char *str );
  • 參數:str  輸出字符串
  • 返回值:如果成功返回非負值。失敗返回EOF

  puts 函數寫入 str到標準輸出流 stdout,替換字符串的終止 null 字符 (“\0 ") 將一個換行符 (“\n”) 在輸出流。

3.2.2 fputs函數

  • 函數原型:int fputs( const char *str, FILE *stream );
  • 參數:
    • str 輸出字符串
    • stream 指向 FILE 結構的指針    
  • 返回值:成功返回一個非負值,失敗,返回EOF  

四、關鍵字

4.1 sizeof---獲取類型的大小(以字節為單位)

  用法:對於所有其他類型(包括結構),sizeof 運算符只能在不安全代碼塊中使用。

  sizeof unary-expression sizeof ( type-name )

  sizeof 運算符的結果為 size_t 類型,它是包含文件 STDDEF.H 中定義的整數類型。 利用此運算符,你可以避免在程序中指定依賴於計算機的數據大小。

  sizeof 的操作數可以是下列項之一:

  類型名稱。 若要將 sizeof 用於類型名稱,則該名稱必須用括號括起。

  一個表達式。 當用於表達式時,無論是否使用括號都可指定 sizeof。 不計算表達式。

  sizeof 運算符應用到 char 類型的對象時,它將生成 1。 sizeof 運算符應用到數組時,它將產生該數組的字節總數,而非由數組標識符表示的指針的大小。 若要獲取由數組標識符表示的指針的大小,請將其作為參數傳遞給使用 sizeof 的函數。

  sizeof 運算符應用到 class、struct 或 union 類型時,結果為該類型的對象中的字節數,以及添加的用於在字邊界上對齊成員數據的任何填充。 結果不一定對應於通過將各個成員的存儲需求相加計算出的大小。

  sizeof 運算符永遠不會產生 0,即使對於空類也是如此。

  sizeof 運算符不能用於以下操作數:

  • 函數。 (但是,sizeof 可應用於指向函數的指針。)

  • 位域。
  • 未定義的類。
  • void 類型。
  • 動態分配的數組。
  • 外部數組。
  • 不完整類型。
  • 帶括號的不完整類型的名稱。

  sizeof 運算符應用於引用時,結果與 sizeof 應用到對象本身時的結果相同。

  如果某個未確定大小的數組是結構的最後一個元素,則 sizeof 運算符將返回沒有該數組的結構的大小。

  sizeof 運算符通常用於通過使用以下形式的表達式計算數組中的元素數量:sizeof array / sizeof array[0]

  // Constant value 4:

  int intSize = sizeof(int);

4.2 _countof---計算靜態分配的數組中元素的數量。

  函數原型:size_t _countof( array );   返回數組中的元素個數   確保 array 實際上是數組,而不是指針。 在 C 中,如果 _countof 是指針,則 array 將生成錯誤結果。 在 C++ 中,如果 _countof 是指針,則 array 將無法編譯。   必須包含頭文件 stdlib.h

  int s[20];

  _countof(s); == sizeof(s)/sizeof(s[0]);

  

C語言(三)---輸入和輸出