printf & scanf(二)

scanf() 是C语言中的一个输入函数。与 printf 函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上 #include 。(在有一些实现中,printf函数与scanf函数在使用时可以不使用预编译命令#include 。)它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。

scanf 函数原型

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

scanf 函数一般形式

scanf(格式控制,地址表列)

格式控制含义如printf函数的一样。
地址表列是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。

scanf 函数中的格式说明

用法与 printf 函数的类似

格式字符:

  1. d,i :输入有符号的十进制整数
  2. u :输入无符号的十进制整数
  3. o :输入无符号的八进制整数
  4. x,X:输入无符号的十六进制整数(大小写作用相同)
  5. c :输入单个字符
  6. s :输入字符串,将字符串送到一个字符数组中,在输入时以非空白字符开始,以第 一个空白字符结束。字符串以串结束标志’\0’作为其最后一个字符
  7. f :输入实数,可以用小数形式或指数形式输入
  8. e,E,g,G:与 f 作用,e 与 f , g 可以相互替换(大小写作用相同)

格式附加字符

l :输入长整形数据以及 double 型数据
h:输入短整型数据
域宽:指定输入数据所占宽度(列数),域宽应为正整数
‘ * ’: 本输入项在读入后不赋给相应的变量

1、格式命令可以说明最大域宽。 在百分号(%)与格式码之间的整数用于限制从对应域读入的最大字符数。例如,希望向 address 读入不多于 20 个字符时,可以书写成如下形式:

scanf("%20s",address);

如果输入流的内容多于 20 个字符,则下次 scanf() 从此次停止处开始读入。 若达到最大域宽前已遇到空白符,则对该域的读立即停止;此时,scanf() 跳到下一个域。

2、百分号(%)与格式符之间的星号(*)表示读指定类型的数据但不保存。

scanf("%d%*c%d",&x,&y);

对 10/20 的读入操作中,10 放入变量 x,20 放入 y。

补充

scanf("%d %d",&r,&c);

在输入流中,数据项必须由空格、制表符和新行符分割。逗号和分号等不是分隔符,将接受输入 10 20,但遇到 10,20 则失败。

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

虽然空格、制表符和新行符都用做域分割符号,但读单字符操作中却按一般字符处理。例如,对输入流 “x y” 调用,返回后,x 在变量 a 中,空格在变量 b 中,y 在变量 c 中。

scanf("%dt%d",&x,&y);

给定输入流 “10t20”,将把 10 和 20 分别放到 x 和 y 中,t 被放弃,因为 t 在控制串中。

注意

  • 在高版本的 Visual Studio 编译器中,scanf 被认为是不安全的,被弃用,应当使用scanf_s代替 scanf
  • “&” 操作符一定不能丢,scanf 要求给出变量地址。
  • 对于字符串数组或字符串指针变量,由于数组名可以转换为数组和指针变量名本身就是地址,因此使用scanf()函数时,不需要在它们前面加上"&"操作符。
  • C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。
  • 注意参数的个数一定要对应
scanf("%c%c%c",&a,&b,&c);

如果输入 d e f ,那么就是将 d 赋给了 a ,将 ’ ‘(空格)赋给了 b ,将 e 赋给了 c ,
如果输入 def ,那么才会分别赋给 abc 。

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

如上相反,每个字符需用空格隔开才可以

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

不推荐,因为其中输入时必须加“ , ”,且必须时英文输入,不能用中文格式,易出错

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

不推荐,因为输入必须符合格式,即例如输入 a=1 ,才能得到结果,而不能直接输入 1 ,比较麻烦。

  • 最好在用 scanf 之前用 printf 提示要输入什么,这样可以大大提高代码的质量。
  • 输入时不能任意加空格,否则在遇到第一个空格时即在向计算机表明你已经完成了输入。要输入字符串时,建议用 gets() 。

你可能感兴趣的:(printf & scanf(二))