c笔记---scanf()

来源:互联网 发布:如何淘宝买东西 编辑:程序博客网 时间:2024/05/21 09:25

最近阅读C语言著作《c和指针》,做下笔记。



while(scanf("%d",&b)==1)

{

}

这种scanf的用法,还是第一次看见,所以又去重看了一次scanf();


scanf()

是从标准输入流stdio (标准输入设备,一般指向键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中

#include<stdio.h>



int scanf(“格式控制字符串”, 地址表列);

1.返回值是一个int型,这个值代表:函数成功转换并储存于参数中的个数。

   scanf(“%d”, &a);     返回值为 1

   scanf(“%d%d”, &a,&b);     返回值为  2

   如果a和b都未被成功读入,返回值为0;

   如果遇到错误或遇到end of file,返回值为EOF(在stdio.h里定义EOF这个常量值,用于提示文件结尾)EOF

2.格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。

   格式字符串的一般形式为:
     %[*][输入数据宽度][长度]类型

   scanf(“  %[*][输入数据宽度][长度]类型”, 地址表列);

 (1)*表示读入的数据将被舍弃。带有*的格式指令不对应可变参数列表中的任何数据。

          例:    scanf("%d %*d %d",&a,&b);

当你输入 3 4 5时,3赋值于a,4将不读取,5赋值于b;

(2)[输入数据宽度]:以一个非零的十进制整数形式出现。表示该格式指令最多读入的字符数。

例: scanf("%5d",&a);
输入12345678只把12345赋予变量a,其余部分被截去。


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

                       输入123456789将把12345赋予a,而把5678赋予b

  (3)[长度]:长度格式符为l和h,l表示输入长整型数据(如%ld)和双精度浮点数(如%lf)。h表示输入短整型数据。

    (4)类型
d 输入十进制整数
o 输入八进制整数
x 输入十六进制整数
u 输入无符号十进制整数
f或e 输入实型数(用小数形式或指数形式)
c 输入单个字符
s 输入字符串


  3.&a,&b,&c中的&是寻址操作符,&a表示对象a在内存中的地址[2]  ,是一个右值(即在赋值号右边)。变量a,b,c的地址是在编译阶段分配的(存储顺序由编译器决定)。

  你可以输出一下看看结果

       printf("%d",&c);


         64876126487612

4.注意事项

     (1)在高版本的 Visual Studio 编译器中,scanf 被认为是不安全的,被弃用,应当使用scanf_s代替 scanf。

     (2) 对于字符串数组或字符串指针变量,由于数组名可以转换为数组和指针变量名本身就是地址,因此使用scanf()函数时,不需要在它们前面加上"&"操作符。

                  数组名就是数组的首地址,因此不用加&;

     (3) scanf函数中没有类似printf的精度控制

              scanf("%1.2f",&a);这种是非法的。不能企图用此语句输入小数为2位的实数。

    (4) scanf中要求给出变量地址,如给出变量名则会出错.

              scanf("%d",a);    非法

     (5) 在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔,则可用空格,TAB或回车作间隔。
                 C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。


         如果格式控制串中有非格式字符则输入时也要输入该非格式字符。

                scanf("%d,%d,%d",&a,&b,&c);
其中用非格式符“ , ”作间隔符,故输入时应为:5,6,7。又如:
scanf("a=%d,b=%d,c=%d",&a,&b,&c);

                 则输入应为:a=5,b=6,c=7。


     (6) 在输入字符数据(%c)时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符
          scanf("%c%c%c",&a,&b,&c);  

                   输入abc;没问题

                   若你输入a b c;scanf会读取a  空格  b

                   用scanf("%c %c %c",&a,&b,&c);则不会发生问题。

       以上例程和概念均可在C语言中文网找到:点击打开链接        




















1 0