C語言stdio頭文件(stdio.h)中scanf函數的用法及代碼示例。
用法:
int scanf ( const char * format, ... );
從標準輸入中讀取格式化的數據
附加參數應指向已分配的對象,這些對象的類型由其對應的格式說明符在格式細繩。
參數
- format
- C字符串,其中包含一係列字符,這些字符控製如何處理從流中提取的字符:
- 空格字符:該函數將讀取並忽略下一個非空白字符之前遇到的任何空白字符(空白字符包括空格,換行符和製表符-請參見isspace)。格式字符串中的單個空格可驗證從流中提取的任意數量的空格字符(包括無空格字符)。
- 非空格字符,格式說明符(%)除外:不是空格字符(空白,換行符或製表符)或格式說明符的一部分(以。開頭的任何字符)%字符)使函數從流中讀取下一個字符,並將其與該非空白字符進行比較,如果匹配,則將其丟棄,然後函數繼續處理下一個字符格式。如果字符不匹配,則函數將失敗,返回並保留流中的後續字符未讀。
- 格式說明符:由初始百分號(%)表示格式說明符,用於指定要從流中檢索並存儲到附加參數所指向的位置中的數據的類型和格式。
A 格式說明符為了scanf遵循此原型:
%[*][width][length]specifier
哪裏說明符最後的字符是最重要的組成部分,因為它定義了要提取的字符,它們的解釋以及相應參數的類型:
除了n,任何說明符至少應使用一個字符。否則,匹配失敗,並且掃描到此結束。說明符 描述 提取字符 i Integer 任意數字位數,可以選擇在其前麵加上一個符號(+或者-)。
小數位數默認情況下假設(0-9),但0前綴引入八進製數字(0-7), 和0x 十六進製數字(0-f)。
簽參數。d 或者 u 十進製整數 任意數量的十進製數字(0-9),並可選地在前麵加上一個符號(+或者-)。
d用於簽論點,以及u為未簽名。o 八進製整數 任意數量的八進製數字(0-7),並可選地在前麵加上一個符號(+或者-)。
無符號參數。x 十六進製整數 任意數量的十六進製數字(0-9,a-f,A-F),可以選擇在前麵加上0x或者0X,以及所有可選的前綴(+或者-)。
無符號參數。f,e,g 浮點數 一係列的十進製數字,可以選擇包含小數點,可以在其前麵加上符號(+或者-),然後可選地e或者E字符和十進製整數(或受支持的某些其他序列strtod)。
遵循C99的實現在後麵加上十六進製浮點格式0x
或者0X
。a c Character 下一個字符。如果寬度不是1指定後,該函數將準確讀取寬度字符並將其存儲在作為參數傳遞的數組的連續位置中。末尾沒有空字符。 s 字串 任意數量的非空白字符,在找到的第一個空白字符處停止。在存儲序列的末尾會自動添加一個終止的空字符。 p 指針地址 代表指針的字符序列。所使用的特定格式取決於係統和庫的實現,但與用於格式化的格式相同%p在fprintf中。 [字符] Scanset 方括號之間指定的任意數量的字符。
破折號(-)(不是第一個字符)可能會在某些庫實現中產生不可移植的行為。[^字符] 負掃描集 括號內的任意數量的字符均未指定為字符。 n Count 不消耗任何輸入。
到目前為止讀取的字符數stdin存儲在指定的位置。% % A %其次是%匹配一個%。
這個格式說明符還可以包含sub-specifiers:星號(*),寬度和長度(按此順序),它們是可選的,並遵循以下規範:
sub-specifier 描述 * 可選的起始星號表示要從流中讀取數據但將其忽略(即,它不會存儲在參數所指向的位置)。 width 指定當前讀取操作中要讀取的最大字符數(可選)。 length 之一hh,h,l,ll,j,z,t,L(選修的)。
這會更改相應參數所指向的預期存儲類型(請參見下文)。
此圖顯示了存儲輸入的相應參數的預期類型(帶有和不帶有長度sub-specifier):
說明符 長度 d i u o x f e g a c s [] [^] p n (沒有) int* unsigned int* float* char* void** int* hh signed char* unsigned char* signed char* h short int* unsigned short int* short int* l long int* unsigned long int* double* wchar_t* long int* ll long long int* unsigned long long int* long long int* j intmax_t* uintmax_t* intmax_t* z size_t* size_t* size_t* t ptrdiff_t* ptrdiff_t* ptrdiff_t* L long double*
- ... (additional arguments)
- 取決於格式字符串,函數可能需要一係列附加參數,每個參數都包含一個指向分配存儲的指針,在該存儲中,提取的字符的解釋將以適當的類型存儲。
這些參數至少應與參數存儲的值數量一樣多。格式說明符。該函數將忽略其他參數。
這些參數應該是指針:存儲a的結果scanf對常規變量進行運算時,其名稱前應帶有參考運算符(&) (看example)。
返回值
成功時,該函數返回已成功填充的參數列表的項目數。由於匹配失敗,讀取錯誤或到達的範圍,此計數可以與預期的項目數匹配或更少(甚至為零)。文件結束。如果發生讀取錯誤或文件結束讀取時到達指示符,設置了正確的指示符(feof或者ferror)。而且,如果在成功讀取任何數據之前發生了任何一種情況,EOF返回。
如果在解釋寬字符時發生編碼錯誤,則該函數會設置errno至EILSEQ。
示例
/* 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語言 remove用法及代碼示例
- C語言 rename用法及代碼示例
- C語言 tmpfile用法及代碼示例
- C語言 tmpnam用法及代碼示例
- C語言 fclose用法及代碼示例
- C語言 fflush用法及代碼示例
- C語言 fopen用法及代碼示例
- C語言 freopen用法及代碼示例
- C語言 setbuf用法及代碼示例
- C語言 setvbuf用法及代碼示例
- C語言 fprintf用法及代碼示例
- C語言 fscanf用法及代碼示例
- C語言 printf用法及代碼示例
- C語言 snprintf用法及代碼示例
- C語言 sprintf用法及代碼示例
- C語言 sscanf用法及代碼示例
- C語言 vfprintf用法及代碼示例
- C語言 vfscanf用法及代碼示例
- C語言 vprintf用法及代碼示例
- C語言 vscanf用法及代碼示例
- C語言 vsnprintf用法及代碼示例
- C語言 vsprintf用法及代碼示例
- C語言 vsscanf用法及代碼示例
- C語言 fgetc用法及代碼示例
- C語言 fgets用法及代碼示例
- C語言 fputc用法及代碼示例
- C語言 fputs用法及代碼示例
- C語言 getc用法及代碼示例
- C語言 getchar用法及代碼示例
- C語言 gets用法及代碼示例
- C語言 putc用法及代碼示例
- C語言 putchar用法及代碼示例
- C語言 puts用法及代碼示例
- C語言 ungetc用法及代碼示例
- C語言 fread用法及代碼示例
- C語言 fwrite用法及代碼示例
- C語言 fgetpos用法及代碼示例
- C語言 fseek用法及代碼示例
- C語言 fsetpos用法及代碼示例
- C語言 ftell用法及代碼示例
- C語言 rewind用法及代碼示例
- C語言 clearerr用法及代碼示例
- C語言 feof用法及代碼示例
- C語言 ferror用法及代碼示例
- C語言 perror用法及代碼示例
注:本文由純淨天空篩選整理自C標準庫大神的英文原創作品 C scanf function。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。