当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。