目录搜索
AlgorithmsAlgorithms(算法)bsearchbsearch_sqsortqsort_sAtomic operationsAtomic operations library(原子操作库)ATOMIC_*_LOCK_FREEatomic_compare_exchange_strongatomic_compare_exchange_strong_explicitatomic_compare_exchange_weakatomic_compare_exchange_weak_explicitatomic_exchangeatomic_exchange_explicitatomic_fetch_addatomic_fetch_add_explicitatomic_fetch_andatomic_fetch_and_explicitatomic_fetch_oratomic_fetch_or_explicitatomic_fetch_subatomic_fetch_sub_explicitatomic_fetch_xoratomic_fetch_xor_explicitatomic_flagatomic_flag_clearatomic_flag_clear_explicitATOMIC_FLAG_INITatomic_flag_test_and_setatomic_flag_test_and_set_explicitatomic_initatomic_is_lock_freeatomic_loadatomic_load_explicitatomic_signal_fenceatomic_storeatomic_store_explicitatomic_thread_fence(线程围栏)ATOMIC_VAR_INITkill_dependencymemory_order(内存排序)C keywordsauto(自动存储)break(跳出循环)C keywords(关键词)casecharconst(常量修饰符)continuedefault(预设运算式)dodouble(双精度浮点型)elseenum(枚举类型)extern(全局变量)float(浮点数)forfortrangoto(goto语句)if(if语句)inline(行内函式)intlong(长整型)register(寄存器变量)restrict( restrict类型限定符)returnshortsignedsizeof(sizeof运算符)static(静态变量)struct(结构体)switch(switch语句)typedef(typedef关键字)union(联合体)unsigned(无符号)void(空类型)volatile(volatile变量)while(while语句)_Alignas_Alignof_Atomic_Bool_Complex_Generic_Imaginary_Noreturn_Static_assert_Thread_localC language#define directive#elif directive#else directive#endif directive#error directive#if directive#ifdef directive#ifndef directive#include directive#line directive#pragma directivealignas(对齐指定符)Alternative operators and tokens(替代运算符和令牌)AnalyzabilityArithmetic operatorsArithmetic typesArray declaration(数组声明)Array initialization(阵列初始化)ASCII ChartAssignment operators(赋值运算符)types(atomic类型限定符)Basic conceptsBit fields(位域)break statementC languageC Operator Precedencecast operatorcharacter constant(字符字面量)Comments(注释符)Comparison operators(比较运算符)compound literals(符合字面量)Conditional inclusion(条件包含)Conformance(一致性)const type qualifier(const 限定符)Constant expressions(常量表达)continue statementDeclarations(声明)do-while loopEnumerations(枚举类型)Escape sequences(转义字符)Expressions(表达式)External and tentative definitions(外部和暂定的定义)File scope(文件范围)floating constant(浮点常量)for loopFunction declarations(函数声明)Function definitions(函数声明)FunctionsGeneric selection泛型选择goto statementIdentifier(标示符)if statementImplicit conversions(隐式转换)Increment/decrement operators(前置/后置操作符)Initialization(初始化)inline function specifier(内联函式)integer constantLifetime(生命期)Logical operators(逻辑运算符)Lookup and name spacesMain function(主函式)Member access operators(会员接入运营商)Memory modelObjects and alignment(字节对齐)Order of evaluation(评估顺序)Other operatorsPhases of translation(翻译阶段)Pointer declarationPreprocessor(预处理)restrict type qualifier(restrict类型限定符)return statementScalar initialization(标量类型初始化)Scope(范围)sizeof operator(sizeof运算符)Statements(陈述)static assert declaration(静态断言声明)Static storage duration(静态存储周期)Storage-class specifiers(存储类说明符)string literals(字符串字面量)Struct and union initialization(结构体与联合体初始化)Struct declaration(结构体声明)switch statementThread storage duration(线程存储时间)TypeType(类型)Typedef declaration(Typedef声明)Undefined behavior(未定义行为)Union declaration(联合体声明)Value categories(值类别)Variadic arguments(变长参数宏)volatile type qualifier(volatile 类型限定符)while loop_Alignof operator_Noreturn function specifierDate and timeasctime(asctime函数)asctime_sclockCLOCKS_PER_SECclock_tctime(ctime函数)ctime_sDate and time utilities(日期和时间库)difftime(计算两个时间的间隔)gmtimegmtime_slocaltimelocaltime_smktime(将时间结构数据转换成经过的秒数的函数)strftime(格式化输出时间函数)timetimespectimespec_gettime_ttmwcsftime(格式化时间宽字符)Dynamic memory managementaligned_allocC memory management library(内存管理库)callocfree(释放动态分配空间的函数)malloc(动态分配内存空间的函数)realloc(重新分配内存空间的函数)Error handlingabort_handler_sassert(断言)constraint_handler_terrno(错误报告)Error handling(错误处理)Error numbers(错误个数)ignore_handler_sset_constraint_handler_sstatic_assertFile input/outputclearerr(清除/复位)fclosefeofferrorfflush(清空文件缓冲区)fgetcfgetposfgetsfgetwcfgetwsFile input/outputfopenfopen_sfprintffprintf_sfputcfputsfputwcfputwsfreadfreopenfreopen_sfscanffscanf_sfseekfsetposftellfwidefwprintffwprintf_sfwritefwscanffwscanf_sgetcgetchargetsgets_sgetwcharperrorprintfprintf_sputcputcharputsputwcputwcharremoverenamerewindscanfscanf_ssetbufsetvbufsnprintfsprintfsscanfsscanf_sswprintfswprintf_sswscanfswscanf_stmpfiletmpfile_stmpnamtmpnam_sungetcungetwcvfprintfvfprintf_svfscanfvfscanf_svfwprintfvfwprintf_svfwscanfvfwscanf_svprintfvprintf_svscanfvscanf_svsnprintfvsprintfvsscanfvsscanf_svswprintfvswprintf_svswscanfvswscanf_svwprintfvwprintf_svwscanfvwscanf_swprintfwprintf_swscanfwscanf_sLocalization supportlconvLC_ALLLC_COLLATELC_CTYPELC_MONETARYLC_NUMERICLC_TIMElocaleconvLocalization supportsetlocaleNumericsabsacosacosfacoshacoshfacoshlacoslasinasinfasinhasinhfasinhlasinlatanatan2atan2fatan2latanfatanhatanhfatanhlatanlcabscabsfcabslcacoscacosfcacoshcacoshfcacoshlcacoslcargcargfcarglcasincasinfcasinhcasinhfcasinhlcasinlcatancatanfcatanhcatanhfcatanhlcatanlcbrtcbrtfcbrtlccosccosfccoshccoshfccoshlccoslceilceilfceillcexpcexpfcexplcimagcimagfcimaglclogclogfcloglCMPLXCMPLXFCMPLXLCommon mathematical functionscomplexComplex number arithmeticconjconjfconjlcopysigncopysignfcopysignlcoscosfcoshcoshfcoshlcoslcpowcpowfcpowlcprojcprojfcprojlcrealcrealfcreallcsincsinfcsinhcsinhfcsinhlcsinlcsqrtcsqrtfcsqrtlctanctanfctanhctanhfctanhlctanldivdouble_terferfcerfcferfclerfferflexpexp2exp2fexp2lexpfexplexpm1expm1fexpm1lfabsfabsffabslfdimfeclearexceptfegetenvfegetexceptflagfegetroundfeholdexceptferaiseexceptfesetenvfesetexceptflagfesetroundfetestexceptfeupdateenvFE_ALL_EXCEPTFE_DFL_ENVFE_DIVBYZEROFE_DOWNWARDFE_INEXACTFE_INVALIDFE_OVERFLOWFE_TONEARESTFE_TOWARDZEROFE_UNDERFLOWFE_UPWARDFloating-point environmentfloat_tfloorfloorffloorlfmafmaffmalfmaxfmaxffmaxlfminfminffminlfmodfmodffmodlfpclassifyFP_INFINITEFP_NANFP_NORMALFP_SUBNORMALFP_ZEROfrexpfrexpffrexplHUGE_VALHUGE_VALFHUGE_VALLhypothypotfhypotlIilogbilogbfilogblimaginaryimaxabsimaxdivINFINITYisfiniteisgreaterisgreaterequalisinfislessislessequalislessgreaterisnanisnormalisunorderedlabsldexpldexpfldexplldivlgammalgammaflgammalllabslldivllrintllrintfllrintlllroundllroundfllroundlloglog10log10flog10llog1plog1pflog1pllog2log2flog2llogblogbflogbllogflogllrintlrintflrintllroundlroundflroundlMATH_ERREXCEPTmath_errhandlingMATH_ERRNOmodfmodffmodflnanNANnanfnanlnearbyintnearbyintfnearbyintlnextafternextafterfnextafterlnexttowardnexttowardfnexttowardlNumericspowpowfpowlPseudo-random number generationrandRAND_MAXremainderremainderfremainderlremquoremquofremquolrintrintfrintlroundroundfroundlscalblnscalblnfscalblnlscalbnscalbnfscalbnlsignbitsinsinfsinhsinhfsinhlsinlsqrtsqrtfsqrtlsrandtantanftanhtanhftanhltanltgammatgammaftgammaltrunctruncftrunclType-generic math_Complex_I_Imaginary_IProgram supportabortatexitat_quick_exitexitEXIT_FAILUREEXIT_SUCCESSgetenvgetenv_sjmp_buflongjmpProgram support utilitiesquick_exitraisesetjmpSIGABRTSIGFPESIGILLSIGINTsignalSIGSEGVSIGTERMsig_atomic_tSIG_DFLSIG_ERRSIG_IGNsystem_ExitStringsatofatoiatolatollbtowcc16rtombc32rtombchar16_tchar32_tisalnumisalphaisblankiscntrlisdigitisgraphislowerisprintispunctisspaceisupperiswalnumiswalphaiswblankiswcntrliswctypeiswdigitiswgraphiswloweriswprintiswpunctiswspaceiswupperiswxdigitisxdigitmblenmbrlenmbrtoc16mbrtoc32mbrtowcmbsinitmbsrtowcsmbsrtowcs_smbstate_tmbstowcsmbstowcs_smbtowcmemchrmemcmpmemcpymemcpy_smemmovememmove_smemsetmemset_sNull-terminated byte stringsNull-terminated multibyte stringsNull-terminated wide stringsstrcatstrcat_sstrchrstrcmpstrcollstrcpystrcpy_sstrcspnstrerrorstrerrorlen_sstrerror_sStrings librarystrlenstrncatThread supportcall_oncecnd_broadcastcnd_destroycnd_initcnd_signalcnd_timedwaitcnd_waitmtx_destroymtx_initmtx_lockmtx_plainmtx_recursivemtx_timedmtx_timedlockmtx_trylockmtx_unlockonce_flagONCE_FLAG_INITthrd_busythrd_createthrd_currentthrd_detachthrd_equalthrd_errorthrd_exitthrd_jointhrd_nomemthrd_sleepthrd_successthrd_timedoutthrd_yieldThread support librarythread_localtss_createtss_deleteTSS_DTOR_ITERATIONStss_gettss_setType supportBoolean type support libraryFixed width integer typesFLT_EVAL_METHODFLT_ROUNDSmax_align_tNULLNumeric limitsoffsetofptrdiff_tsize_tType supportVariadic functionsVariadic functionsva_argva_copyva_endva_listva_start
文字

在头文件<stdio.h>中定义




(1)


int scanf(const char * format,...);

(直到C99)


int scanf(const char * restrict format,...);

(自C99以来)



(2)


int fscanf(FILE * stream,const char * format,...);

(直到C99)


int fscanf(FILE * restrict stream,const char * restrict format,...);

(自C99以来)



(3)


int sscanf(const char * buffer,const char * format,...);

(直到C99)


int sscanf(const char *限制缓冲区,const char *限制格式,...);

(自C99以来)


int scanf_s(const char * restrict format,...);

(4)

(自C11以来)

int fscanf_s(FILE * restrict stream,const char * restrict format,...);

(5)

(自C11以来)

int sscanf_s(const char *限制缓冲区,const char *限制格式,...);

(6)

(自C11以来)

从各种来源读取数据,根据其解释并将format结果存储到给定位置。

1)从中读取数据 stdin

2)从文件流中读取数据 stream

3)从空终止的字符串中读取数据buffer。到达字符串的末尾等同于达到文件结束条件fscanf

4-6)与(1-3)相同,不同之处在于%c%s%[转换说明符每个都需要两个参数(通常的指针和rsize_t表示接收数组大小的类型值,当使用%c读取时可能为1成一个字符),除了在运行时检测到以下错误并调用当前安装的约束处理函数:

  • 指针类型的任何参数都是空指针

  • formatstream或者buffer是空指针

  • %c,%s或%[,加上终止空字符,将会超过为每个转换说明符提供的第二个(rsize_t)参数所写的字符数

  • 可选地,还有任何其他可检测到的错误,例如未知的转换说明符

由于所有的边界检查功能,scanf_sfscanf_s,和sscanf_s仅保证可供如果__STDC_LIB_EXT1__由实现所定义,并且如果用户定义__STDC_WANT_LIB_EXT1__的整数常数1,包括之前<stdio.h>

参数

-

输入文件流从中读取



















































































缓冲

-

指向以null结尾的字符串读取的指针



















































































格式

-

指向以空字符结尾的字符串的指针,指定如何读取输入。格式字符串由。非空白多字节字符除%以外:格式字符串中的每个这样的字符只会从输入流中消耗一个完全相同的字符,或者如果流中的下一个字符不相等,则会导致函数失败。空格字符:格式字符串中的任何单个空白字符都会消耗输入中的所有可用连续空格字符(如同通过调用循环中的isspace一样来确定)。请注意,格式字符串中的“\ n”,“”,“\ t \ t”或其他空格没有区别。转换规格。每个转换规范具有以下格式:介绍%字符(可选)分配抑制字符*。如果存在此选项,则函数不会将转换结果分配给任何接收参数。(可选)指定最大字段宽度的整数数字(大于零),即该函数在执行当前转换规范指定的转换时允许使用的最大字符数。请注意,如果未提供宽度,%s和%[可能会导致缓冲区溢出。(可选)长度修饰符,用于指定接收参数的大小,即实际的目标类型。这会影响转换精度和溢出规则。每种转换类型的默认目标类型都不相同(请参阅下表)。转换格式说明符以下格式说明符可用:转换说明符说明参数类型长度修饰符hh(C99)。h(无)ll(C99)。j(C99)。z(C99)。t(C99)。L%匹配字面值%N / AN / AN / AN / AN / AN / AN / AN / AN / c与字符或字符序列匹配如果使用宽度说明符,则匹配完全宽度字符(参数必须是指向具有足够空间的阵列的指针)。与%s和%[不同,不会将空字符追加到数组。N / AN / A char * wchar_t * N / AN / AN / AN / AN / A与非空白字符序列(字符串)匹配如果使用宽度说明符,则匹配宽度或直到第一个空白字符,以先出现者为准。除了匹配的字符外,总是存储一个空字符(所以参数数组必须至少有宽度+ 1个字符的空间)。集匹配字符集中的非空字符序列。如果该集合的第一个字符是^,则不匹配该集合中的所有字符。如果该集合以]或^]开头,则该字符也包含在集合中。它是实现定义的,字符 - 在扫描集中的非初始位置可以指示一个范围,如0-9。如果使用宽度说明符,则只匹配宽度。除了匹配的字符外,总是存储一个空字符(所以参数数组必须至少有宽度+ 1个字符的空间)。d匹配一个十进制整数。数字的格式与strtol()预期的相同,基本参数的值为10。有符号字符*或无符号字符*有符号短符号*或无符号短符号*有符号整数*或无符号整数*有符号长符号*无符号长符号*长符号*长符号或无符号长符号* intmax_t *或uintmax_t * size_t * ptrdiff_t * N / A i匹配一个整数。数字的格式与strtol()所预期的相同,基本参数的值为0(基数由解析的第一个字符决定)。你匹配一个无符号的十进制整数。数字的格式与strtoul()的预期相同,基本参数的值为10。o匹配一个无符号的八进制整数。数字的格式与strtoul()所预期的基本参数的值为8相同。x,X匹配一个无符号的十六进制整数。数字的格式与strtoul()预期的基本参数的值为16相同。n返回到目前为止读取的字符数。没有输入被消耗。不增加分配计数。如果说明符具有定义的分配抑制运算符,则行为是未定义的。a,A(C99)e,E f,F g,G匹配一个浮点数。数字的格式与strtof()的预期相同。N / AN / A float * double * N / AN / AN / AN / long long double * p匹配定义指针的实现定义字符序列。printf系列函数应该使用%p格式说明符产生相同的序列。N / AN / A void ** N / AN / AN / AN / AN / AN / A对于除n以外的每个转换说明符,输入字符的最长序列不超过任何指定的字段宽度,并且或者正是转换说明符所期望的或者是期望的序列的前缀,是从流中消耗的东西。在消耗序列之后的第一个字符(如果有的话)仍然未读。如果消耗的序列长度为零或消费的序列无法如上所述进行转换,则会发生匹配失败,除非文件结束,编码错误或读取错误阻止来自流的输入,在这种情况下,它是输入失败。在尝试解析输入之前,除[,c和n之外的所有转换说明符都会消耗并放弃所有前导空白字符(通过调用isspace确定)。这些消耗的字符不会计入指定的最大字段宽度。转换说明符lc,ls和l [执行多字节到宽字符转换,就好像通过调用mbrtowc(),并在转换第一个字符之前将mbstate_t对象初始化为零。转换说明符s和[除了匹配的字符外,总是存储空终止符。目标数组的大小必须至少比指定的字段宽度大1。使用%s或%[,不指定目标数组大小,与get一样不安全。固定宽度整数类型(int8_t等)的正确转换规范在标头<inttypes.h>中定义(尽管SCNdMAX,SCNuMAX等与%jd,%ju等同义)。每个转换说明符的操作之后都有一个序列点; 这允许将多个字段存储在相同的“汇”变量中。当解析一个不带数字的指数结束的不完整浮点值时,例如用转换说明符%f解析“100er”时,会消耗序列“100e”(可能有效的浮点数的最长前缀) ,导致匹配错误(消耗的序列不能转换为浮点数),并保留“r”。现有的实现不遵循这个规则,并回滚到只消耗“100”,留下“呃”,例如glibc错误1765。导致匹配错误(消耗的序列不能转换为浮点数),并保留“r”。现有的实现不遵循这个规则,并回滚到只消耗“100”,留下“呃”,例如glibc错误1765。导致匹配错误(消耗的序列不能转换为浮点数),并保留“r”。现有的实现不遵循这个规则,并回滚到只消耗“100”,留下“呃”,例如glibc错误1765。

Conversion specifier

Explanation

Argument type

length modifier

hh (C99).

h

(none)

l

ll (C99).

j (C99).

z (C99).

t (C99).

L

%

matches literal %

N/A

N/A

N/A

N/A

N/A

N/A

N/A

N/A

N/A

c

matches a character or a sequence of characters  If a width specifier is used, matches exactly width characters (the argument must be a pointer to an array with sufficient room). Unlike %s and %[, does not append the null character to the array.

N/A

N/A

char*

wchar_t*

N/A

N/A

N/A

N/A

N/A

s

matches a sequence of non-whitespace characters (a string)  If width specifier is used, matches up to width or until the first whitespace character, whichever appears first. Always stores a null character in addition to the characters matched (so the argument array must have room for at least width+1 characters).

set

matches a non-empty sequence of character from set of characters.  If the first character of the set is ^, then all characters not in the set are matched. If the set begins with ] or ^] then the ] character is also included into the set. It is implementation-defined whether the character - in the non-initial position in the scanset may be indicating a range, as in 0-9. If width specifier is used, matches only up to width. Always stores a null character in addition to the characters matched (so the argument array must have room for at least width+1 characters).

d

matches a decimal integer.  The format of the number is the same as expected by strtol() with the value 10 for the base argument.

signed char* or unsigned char*

signed short* or unsigned short*

signed int* or unsigned int*

signed long* or unsigned long*

signed long long* or unsigned long long*

intmax_t* or uintmax_t*

size_t*

ptrdiff_t*

N/A

i

matches an integer.  The format of the number is the same as expected by strtol() with the value 0 for the base argument (base is determined by the first characters parsed).

u

matches an unsigned decimal integer.  The format of the number is the same as expected by strtoul() with the value 10 for the base argument.

o

matches an unsigned octal integer.  The format of the number is the same as expected by strtoul() with the value 8 for the base argument.

x, X

matches an unsigned hexadecimal integer.  The format of the number is the same as expected by strtoul() with the value 16 for the base argument.

n

returns the number of characters read so far.  No input is consumed. Does not increment the assignment count. If the specifier has assignment-suppressing operator defined, the behavior is undefined.

a, A(C99) e, E f, F g, G

matches a floating-point number.  The format of the number is the same as expected by strtof().

N/A

N/A

float*

double*

N/A

N/A

N/A

N/A

long double*

p

matches implementation defined character sequence defining a pointer.  printf family of functions should produce the same sequence using %p format specifier.

N/A

N/A

void**

N/A

N/A

N/A

N/A

N/A

N/A

Conversion specifier

Explanation

Argument type



















































































length modifier

hh (C99).

h

(none)

l

ll (C99).

j (C99).

z (C99).

t (C99).

L












































































%

matches literal %

N/A

N/A

N/A

N/A

N/A

N/A

N/A

N/A

N/A











































































c

matches a character or a sequence of characters  If a width specifier is used, matches exactly width characters (the argument must be a pointer to an array with sufficient room). Unlike %s and %[, does not append the null character to the array.

N/A

N/A

char*

wchar_t*

N/A

N/A

N/A

N/A

N/A











































































s

matches a sequence of non-whitespace characters (a string)  If width specifier is used, matches up to width or until the first whitespace character, whichever appears first. Always stores a null character in addition to the characters matched (so the argument array must have room for at least width+1 characters).




















































































set

matches a non-empty sequence of character from set of characters.  If the first character of the set is ^, then all characters not in the set are matched. If the set begins with ] or ^] then the ] character is also included into the set. It is implementation-defined whether the character - in the non-initial position in the scanset may be indicating a range, as in 0-9. If width specifier is used, matches only up to width. Always stores a null character in addition to the characters matched (so the argument array must have room for at least width+1 characters).




















































































d

matches a decimal integer.  The format of the number is the same as expected by strtol() with the value 10 for the base argument.

signed char* or unsigned char*

signed short* or unsigned short*

signed int* or unsigned int*

signed long* or unsigned long*

signed long long* or unsigned long long*

intmax_t *或uintmax_t *

为size_t *

ptrdiff_t的*

N / A











































































一世

匹配一个整数。数字的格式与strtol()所期望的相同,基本参数的值为0(基数由解析的第一个字符决定)。




















































































匹配一个无符号的十进制整数。数字的格式与strtoul()的预期相同,基本参数的值为10。




















































































匹配一个无符号的八进制整数。数字的格式与strtoul()的预期相同,基本参数的值为8。




















































































x,X

匹配一个无符号的十六进制整数。数字的格式与strtoul()预期的基本参数的值为16相同。




















































































ñ

返回迄今阅读的字符数。没有输入被消耗。不增加分配计数。如果说明符具有定义的分配抑制运算符,则行为是未定义的。




















































































a,A(C99)e,E f,F g,G

匹配一个浮点数。数字的格式与strtof()的预期相同。

N / A

N / A

浮动*

双*

N / A

N / A

N / A

N / A

长双*











































































p

匹配定义指针的实现定义的字符序列。printf系列函数应该使用%p格式说明符产生相同的序列。

N / A

N / A

无效**

N / A

N / A

N / A

N / A

N / A

N / A











































































...

-

接收参数



















































































  • 非空白多字节字符除外%:格式字符串中的每个这样的字符只消耗输入流中的一个完全相同的字符,或者如果流中的下一个字符不相等,则会导致函数失败。

  • 空白字符:格式字符串中的任何单个空白字符都会消耗输入中所有可用的连续空白字符(如同通过调用isspace循环来确定)。请注意,有没有什么区别"\n"" ""\t\t"在格式字符串或其他空白。

  • 转换规格。每个转换规范具有以下格式:

    • 介绍%人物

    • (可选)分配抑制字符*。如果存在此选项,则函数不会将转换结果分配给任何接收参数。

    • (可选)指定最大字段宽度的整数数字(大于零),即该函数在执行由当前转换规范指定的转换时允许使用的最大字符数。请注意,如果未提供宽度,%s和%[可能会导致缓冲区溢出。

    • (可选)长度修饰符,用于指定接收参数的大小,即实际的目标类型。这会影响转换精度和溢出规则。每种转换类型的默认目标类型都不相同(请参阅下表)。

    • 转换格式说明符

以下格式说明符可用:

Conversion

说明符说明参数类型长度修饰符    hh(C99)。

h   (none)   l   ll (C99).

j (C99).

z (C99).

t (C99).

L %   匹配字面%   N / AN / AN / AN / AN / AN / AN / AN / AN / A      c    一个匹配字符或序列字符如果使用宽度说明,完全匹配宽度的字符(参数必须是一个指针数组有足够的空间)。与%s和%[不同,不会将空字符追加到数组。

N/A   N/A   char*

wchar_t*

N / AN / AN / AN / AN / A      s    匹配非空白字符序列(字符串)如果使用宽度说明符,则匹配宽度或直到第一个空白字符,以先出现者为准。除了匹配的字符外,总是存储一个空字符(所以参数数组必须至少有宽度+ 1个字符的空间)。

 `[`set`]`   matches a non-empty sequence of character from set of characters.  If the first character of the set is `^`, then all characters not in the set are matched. If the set begins with `]` or `^]` then the `]` character is also included into the set. It is implementation-defined whether the character `-` in the non-initial position in the scanset may be indicating a range, as in `[0-9]`. If width specifier is used, matches only up to _width_. Always stores a null character in addition to the characters matched (so the argument array must have room for at least _width+1_ characters).
 `d`   matches a **decimal integer**.  The format of the number is the same as expected by [`strtol()`](../string/byte/strtol) with the value `10` for the `base` argument.
`signed char*` or `unsigned char*`
`signed short*` or `unsigned short*`
`signed int*` or `unsigned int*`
`signed long*` or `unsigned long*`
`signed long long*` or `unsigned long long*`
[`intmax_t`](../types/integer)`*` or [`uintmax_t`](../types/integer)`*`

size_t*

ptrdiff_t*

N / A      i   匹配整数。数的格式是相同的通过按预期strtol()与值0base参数(基部由解析的第一字符确定)。

 `u`   matches an unsigned **decimal integer**.  The format of the number is the same as expected by [`strtoul()`](../string/byte/strtoul) with the value `10` for the `base` argument.
 `o`   matches an unsigned **octal integer**.  The format of the number is the same as expected by [`strtoul()`](../string/byte/strtoul) with the value `8` for the `base` argument.
 `x`, `X`   matches an unsigned **hexadecimal integer**.  The format of the number is the same as expected by [`strtoul()`](../string/byte/strtoul) with the value `16` for the `base` argument.
 `n`   returns the **number of characters read so far**.  No input is consumed. Does not increment the assignment count. If the specifier has assignment-suppressing operator defined, the behavior is undefined.
 `a`, `A`(C99)

e, E

f, F

gG   匹配一个浮点数。数字的格式与预期的相同strtof()

N/A   N/A   float*

double*

N/A   N/A   N/A   N/A   long double*

 `p`   matches implementation defined character sequence defining a **pointer**.  `printf` family of functions should produce the same sequence using `%p` format specifier.

N/A   N/A   void**

n不适用不适用不适用不适用不适用不适用不适用不适用于任何指定字段宽度的最长输入字符序列的   每个转换说明符,或者正是转换说明符所期望的或者是它期望的顺序是从流中消耗的。在消耗序列之后的第一个字符(如果有的话)仍然未读。如果消耗的序列长度为零或消费的序列不能如上所述进行转换,则会发生匹配失败,除非文件结束,编码错误或读取错误阻止了来自流的输入,在这种情况下,它是输入失败。

在尝试解析输入之前,除了[,,之外的所有转换说明符都会消耗并放弃所有前导空白字符(如同通过调用一样确定)。这些消耗的字符不会计入指定的最大字段宽度。cnisspace

转换说明符lclsl[执行多字节到宽字符转换,就好像通过在第一个字符转换之前使用初始化为零mbrtowc()mbstate_t对象调用一样。

除了匹配的字符之外,转换说明符s[始终存储空终止符。目标数组的大小必须至少比指定的字段宽度大1。在不指定目标数组大小的情况下,使用%s%[不安全gets

对于固定宽度的整数类型(正确的转换规格int8_t<inttypes.h>还(虽然,等等)都在头定义SCNdMAXSCNuMAX等是同义词%jd%ju等)。

每个转换说明符的操作之后都有一个序列点; 这允许将多个字段存储在相同的“汇”变量中。

在解析指数中不包含数字的不完整浮点值时(例如"100er"使用转换说明符进行解析),会消耗%f序列"100e"(可能有效的浮点数的最长前缀),从而导致匹配错误(消耗的序列不能转换为浮点数),"r"剩余的。现有的实现不遵循此规则并仅回滚消耗"100",只留下"er"例如glibc错误1765。

 ...   -   receiving arguments

Return value

1-3)成功分配的接收参数数量(EOF如果在分配第一个接收参数之前发生匹配故障,则可能为零),或者在分配第一个接收参数前发生输入故障。

4-6)与(1-3)相同,但是EOF如果存在运行时约束冲突,也会返回。

注意

由于大多数转换说明符首先消耗所有连续的空白,所以代码如。

scanf("%d", &a);scanf("%d", &b);

将读取在不同行上输入的两个整数(第二个%d将使用第一个剩下的换行符)或在同一行上,由空格或制表符分隔(第二个%d将使用空格或制表符)。不使用前导空格的转换说明符(如%c)可以通过在格式字符串中使用空格字符来完成:

scanf("%d", &a);scanf(" %c", &c); // ignore the endline after %d, then read a char

#define __STDC_WANT_LIB_EXT1__ 1#include <stdio.h>#include <stddef.h>#include <locale.h>
 int main(void){
    int i, j;
    float x, y;
    char str1[10], str2[4];
    wchar_t warr[2];    setlocale(LC_ALL, "en_US.utf8");
 
    char input[] = "25 54.32E-1 Thompson 56789 0123 56ß水";    /* parse as follows:
       %d: an integer
       %f: a floating-point value
       %9s: a string of at most 9 non-whitespace characters
       %2d: two-digit integer (digits 5 and 6)
       %f:  a floating-point value (digits 7, 8, 9)
       %*d: an integer which isn't stored anywhere
       ' ': all consecutive whitespace
       %3[0-9]: a string of at most 3 decimal digits (digits 5 and 6)
       %2lc: two wide characters, using multibyte to wide conversion  */
    int ret = sscanf(input, "%d%f%9s%2d%f%*d %3[0-9]%2lc",                     &i, &x, str1, &j, &y, str2, warr); 
    printf("Converted %d fields:\ni = %d\nx = %f\nstr1 = %s\n"           "j = %d\ny = %f\nstr2 = %s\n"           "warr[0] = U+%x warr[1] = U+%x\n",
           ret, i, x, str1, j, y, str2, warr[0], warr[1]);
 #ifdef __STDC_LIB_EXT1__
    int n = sscanf_s(input, "%d%f%s", &i, &x, str1, (rsize_t)sizeof str1);    // writes 25 to i, 5.432 to x, the 9 bytes "thompson\0" to str1, and 3 to n.#endif}

输出:

Converted 7 fields:i = 25x = 5.432000str1 = Thompson
j = 56y = 789.000000str2 = 56warr[0] = U+df warr[1] = U+6c34

参考

  • C11标准(ISO / IEC 9899:2011):

    • 7.21.6.2 fscanf函数(p:317-324)

    • 7.21.6.4 scanf函数(p:325)

    • 7.21.6.7 sscanf函数(p:326)

    • K.3.5.3.2 fscanf_s函数(p:592-593)

    • K.3.5.3.4 scanf_s函数(p:594)

    • K.3.5.3.7 sscanf_s函数(p:596)

  • C99标准(ISO / IEC 9899:1999):

    • 7.19.6.2 fscanf函数(p:282-289)

    • 7.19.6.4 scanf函数(p:290)

    • 7.19.6.7 sscanf函数(p:291)

  • C89 / C90标准(ISO / IEC 9899:1990):

    • 4.9.6.2 fscanf函数

    • 4.9.6.4 scanf函数

    • 4.9.6.6 sscanf函数

上一篇:下一篇: