當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


C語言 scanf用法及代碼示例


C語言stdio頭文件(stdio.h)中scanf函數的用法及代碼示例。

用法:

int scanf ( const char * format, ... );
從標準輸入中讀取格式化的數據
從讀取數據stdin並根據參數存儲它們格式到附加參數所指向的位置。

附加參數應指向已分配的對象,這些對象的類型由其對應的格式說明符在格式細繩。

參數

format
C字符串,其中包含一係列字符,這些字符控製如何處理從流中提取的字符:
  • 空格字符:該函數將讀取並忽略下一個非空白字符之前遇到的任何空白字符(空白字符包括空格,換行符和製表符-請參見isspace)。格式字符串中的單個空格可驗證從流中提取的任意數量的空格字符(包括無空格字符)。
  • 非空格字符,格式說明符(%)除外:不是空格字符(空白,換行符或製表符)或格式說明符的一部分(以。開頭的任何字符)%字符)使函數從流中讀取下一個字符,並將其與該非空白字符進行比較,如果匹配,則將其丟棄,然後函數繼續處理下一個字符格式。如果字符不匹配,則函數將失敗,返回並保留流中的後續字符未讀。
  • 格式說明符:由初始百分號(%)表示格式說明符,用於指定要從流中檢索並存儲到附加參數所指向的位置中的數據的類型和格式。

A 格式說明符為了scanf遵循此原型:

%[*][width][length]specifier

哪裏說明符最後的字符是最重要的組成部分,因為它定義了要提取的字符,它們的解釋以及相應參數的類型:
說明符描述提取字符
iInteger任意數字位數,可以選擇在其前麵加上一個符號(+或者-)。
小數位數默認情況下假設(0-9),但0前綴引入八進製數字(0-7), 和0x 十六進製數字(0-f)。
參數。
d 或者 u十進製整數任意數量的十進製數字(0-9),並可選地在前麵加上一個符號(+或者-)。
d用於論點,以及u未簽名
o八進製整數任意數量的八進製數字(0-7),並可選地在前麵加上一個符號(+或者-)。
無符號參數。
x十六進製整數任意數量的十六進製數字(0-9a-fA-F),可以選擇在前麵加上0x或者0X,以及所有可選的前綴(+或者-)。
無符號參數。
feg浮點數一係列的十進製數字,可以選擇包含小數點,可以在其前麵加上符號(+或者-),然後可選地e或者E字符和十進製整數(或受支持的某些其他序列strtod)。
遵循C99的實現在後麵加上十六進製浮點格式0x或者0X
a
cCharacter下一個字符。如果寬度不是1指定後,該函數將準確讀取寬度字符並將其存儲在作為參數傳遞的數組的連續位置中。末尾沒有空字符。
s字串任意數量的非空白字符,在找到的第一個空白字符處停止。在存儲序列的末尾會自動添加一個終止的空字符。
p指針地址代表指針的字符序列。所使用的特定格式取決於係統和庫的實現,但與用於格式化的格式相同%p在fprintf中。
[字符]Scanset方括號之間指定的任意數量的字符。
破折號(-)(不是第一個字符)可能會在某些庫實現中產生不可移植的行為。
[^字符]負掃描集括號內的任意數量的字符均未指定為字符。
nCount不消耗任何輸入。
到目前為止讀取的字符數stdin存儲在指定的位置。
%%A %其次是%匹配一個%
除了n,任何說明符至少應使用一個字符。否則,匹配失敗,並且掃描到此結束。

這個格式說明符還可以包含sub-specifiers:星號(*),寬度長度(按此順序),它們是可選的,並遵循以下規範:
sub-specifier描述
*可選的起始星號表示要從流中讀取數據但將其忽略(即,它不會存儲在參數所指向的位置)。
width指定當前讀取操作中要讀取的最大字符數(可選)。
length之一hhhllljztL(選修的)。
這會更改相應參數所指向的預期存儲類型(請參見下文)。

此圖顯示了存儲輸入的相應參數的預期類型(帶有和不帶有長度sub-specifier):
說明符
長度d iu o xf e g ac s [] [^]pn
(沒有)int*unsigned int*float*char*void**int*
hhsigned char*unsigned char*signed char*
hshort int*unsigned short int*short int*
llong int*unsigned long int*double*wchar_t*long int*
lllong long int*unsigned long long int*long long int*
jintmax_t*uintmax_t*intmax_t*
zsize_t*size_t*size_t*
tptrdiff_t*ptrdiff_t*ptrdiff_t*
Llong double*
注意:黃色行表示指定符和C99引入的sub-specifiers。
... (additional arguments)
取決於格式字符串,函數可能需要一係列附加參數,每個參數都包含一個指向分配存儲的指針,在該存儲中,提取的字符的解釋將以適當的類型存儲。
這些參數至少應與參數存儲的值數量一樣多。格式說明符。該函數將忽略其他參數。
這些參數應該是指針:存儲a的結果scanf對常規變量進行運算時,其名稱前應帶有參考運算符(&) (看example)。

返回值

成功時,該函數返回已成功填充的參數列表的項目數。由於匹配失敗,讀取錯誤或到達的範圍,此計數可以與預期的項目數匹配或更少(甚至為零)。文件結束

如果發生讀取錯誤或文件結束讀取時到達指示符,設置了正確的指示符(feof或者ferror)。而且,如果在成功讀取任何數據之前發生了任何一種情況,EOF返回。

如果在解釋寬字符時發生編碼錯誤,則該函數會設置errnoEILSEQ

示例

/* scanf example */
#include <stdio.h>

int main ()
{
  char str [80];
  int i;

  printf ("Enter your family name: ");
  scanf ("%79s",str);  
  printf ("Enter your age: ");
  scanf ("%d",&i);
  printf ("Mr. %s , %d years old.\n",str,i);
  printf ("Enter a hexadecimal number: ");
  scanf ("%x",&i);
  printf ("You have entered %#x (%d).\n",i,i);
  
  return 0;
}


這個例子展示了一些可以讀取的類型scanf
Enter your family name: Soulie
Enter your age: 29
Mr. Soulie , 29 years old.
Enter a hexadecimal number: ff
You have entered 0xff (255).


相關用法


注:本文由純淨天空篩選整理自C標準庫大神的英文原創作品 C scanf function。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。