关于C语言中的scanf的一些说明

scanf

<cstdio>
int scanf ( const char * format, ... );
Read formatted data from stdin
Reads data from stdin and stores them according to the parameter format into the locations pointed by the additional arguments.

The additional arguments should point to already allocated objects of the type specified by their corresponding format specifier within the format string.

    scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。其调用格式为:scanf("<格式化字符串>",<地址表>);scanf()函数返回成功赋值的数据项数,出错时则返回EOF。

    /转载的一点///

其控制串由三类字符构成:

1、格式化说明符;

2、空白符;

3、非空白符;

(A)格式化说明符

格式字符           说明

%a                 读入一个浮点值(仅C99有效) 

%A                 同上

%c                 读入一个字符

%d                 读入十进制整数

%i                 读入十进制,八进制,十六进制整数

%o                 读入八进制整数

%x                 读入十六进制整数

%X                 同上

%c                 读入一个字符

%s                 读入一个字符串

%f                 读入一个浮点数

%F                 同上

%e                 同上

%E                 同上

%g                 同上

%G                 同上

%p                 读入一个指针

%u                 读入一个无符号十进制整数

%n                 至此已读入值的等价字符数

%[]                扫描字符集合

%%                 读%符

附加格式说明字符表

修饰符                       说明

L/l 长度修饰符               输入"长"数据

h 长度修饰符                 输入"短"数据

W 整型常数                   指定输入数据所占宽度

* 星号                       空读一个数据 

hh,ll同上h,l但仅对C99有效。

(B)空白字符

空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符,空白符可以是space,tab,newline等等,直到第一个非空白符出现为止。

(C) 非空白字符

一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。


网上找到几个小例子:

例1.

#include "stdio.h" 

int main(void) 

    int a,b,c; 

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

  printf("%d,%d,%d\n",a,b,c); 

  return 0;

}  

运行时按如下方式输入三个值:

输入:3□4□5

输出:3,4,5 

   (1) &a、&b、&c中的&是地址运算符,分别获得这三个变量的内存地址。

   (2) "%d%d%d"是按十进值格式输入三个数值。输入时,在两个数据之间可以用一个或多个空格、tab键、回车键分隔。

      以下是合法输入方式: 

      ① 3□□4□□□□5↙

      ② 3↙

         4□5↙

      ③ 3(tab键)4↙

         5↙

例2.

#include "stdio.h" 

int main(void) 

int a,b,c;

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

printf("%d,%d,%d\n",a,b,c); 

  return 0;

}  

运行时按如下方式输入三个值:

输入:3,4,5

或者

3,□4,□5

3,□□□4,□5

......

都是合法的,但是","一定要跟在数字后面,如:

3□,4,□5 ↙就非法了,程序出错。


scanf()的格式控制串可以使用其它非空白字符,但在输入时必须输入这些字符。

例:

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

输入: 3,4 ↙(逗号与"%d,%d"中的逗号对应) 

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

输入: a=3,b=4 ↙("a=","b=",逗号与"%d,%d"中的"a=","b="及逗号对应)


3、在用"%c"输入时,空格和“转义字符”均作为有效字符。

例:

scanf("%c%c%c",&c1,&c2,&c3); 

输入:a□b□c↙ 

结果:a→c1,□→c2,b→c3 (其余被丢弃)


scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。

        ① 遇空格、“回车”、“跳格”键。

        ② 遇宽度结束。

        ③ 遇非法输入。

在使用scanf时我们经常碰到一个键盘缓冲区残余的信息问题,比如说:

#include <stdio.h>
int main()
{
    int a;
    char c;
    do
    {
        scanf("%d",&a);
        scanf("%c",&c);
        printf("a=%d     c=%c\n",a,c);
    }while(c!='N');
}
这时候发现输出时a是有具体数值的,然而scanf("%c", &c)是不能正常接收字符的,而且c的输出是个换行,这是因为,我们输入完后敲击了Enter换行,scanf把换行符读入到了c中,为此我们可以采取如下两个措施来解决。
    措施1:采用fflush(stdin)函数,清除一个流,比如上例中在两个scanf之间加入fflush(stdin),即可解决问题。
    措施2:采用getch()或者getchar()函数,比如上例中定义char ch,在两个scanf之间加入ch = getchar();即可解决问题
    PS:网上还有这样一个解决方法,用空格符来处理缓冲区残余信息:
运行出错的程序:                                                                  使用了空格控制符后:
#include <stdio.h>                                                              #include <stdio.h>
int main()                                                                            int main()
{                                                                                       {
    int i;                                                                                     int i;
    char j;                                                                                  char j;
    for(i = 0;i < 10;i++)                                                                for(i = 0;i < 10;i++)
    {                                                                                          {
        scanf("%c",&j);/*这里%前没有空格*/                                           scanf(" %c",&j);/*注意这里%前有个空格*/
    }                                                                                           }
}                                                                                          }

最后,我们再来说一下如何让scanf接收有空格的字符串,例如"Hello world!"
#include <stdio.h>
int main()
{
    char str[80];
    
    scanf("%s",str);
    printf("%s",str);
    return 0;
}
输入:Hello world!
输出:Hello
这是因为 scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。
        ① 遇空格、“回车”、“跳格”键。
        ② 遇宽度结束。
        ③ 遇非法输入。
所以说在扫描到Hello后的空格时就结束了输入,而world!留在了标准输入流中,即stdin中。我们解决这个问题的方法是采用%[]这个格式控制符来使得scanf可以输入带有空格的字符串,即scanf("%[^\n]", str);

OK,关于scanf的一些说明就到此为止~~~


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值