[转]scanf

scanf函数称为格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。

scanf函数的一般形式

scanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。与printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件。scanf函数的一般形式为:
    scanf(“格式控制字符串”, 地址表列);
其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址表列中给出各变量的地址。地址是由地址运算符“&”后跟变量名组成的。

例如:&a、&b分别表示变量a和变量b的地址。

这个地址就是编译系统在内存中给a、b变量分配的地址。在C语言中,使用了地址这个概念,这是与其它语言不同的。 应该把变量的值和变量的地址这两个不同的概念区别开来。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。

变量的地址和变量值的关系
在赋值表达式中给变量赋值,如:
    a=567;
则,a为变量名,567是变量的值,&a是变量a的地址。

但在赋值号左边是变量名,不能写地址,而scanf函数在本质上也是给变量赋值,但要求写变量的地址,如&a。这两者在形式上是不同的。&是一个取地址运算符,&a是一个表达式,其功能是求变量的地址。

【例4-7】

  1. #include <stdio.h>
  2. int main(void){
  3. int a,b,c;
  4. printf("input a,b,c\n");
  5. scanf("%d%d%d",&a,&b,&c);
  6. printf("a=%d,b=%d,c=%d",a,b,c);
  7. return 0;
  8. }

在本例中,由于scanf函数本身不能显示提示串,故先用printf语句在屏幕上输出提示,请用户输入a、b、c的值。执行scanf语句,等待用户输入。在scanf语句的格式串中由于没有非格式字符在“%d%d%d”之间作输入时的间隔,因此在输入时要用一个以上的空格或回车键作为每两个输入数之间的间隔。如:
7 8 9

7
8
9

格式字符串

格式字符串的一般形式为:
    %[*][输入数据宽度][长度]类型
其中有方括号[]的项为任选项。各项的意义如下。

1) 类型
表示输入数据的类型,其格式符和意义如下表所示。

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

2) “*”符
用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值。如:

  1. scanf("%d %*d %d",&a,&b);

当输入为:1   2   3时,把1赋予a,2被跳过,3赋予b。

3) 宽度
用十进制整数指定输入的宽度(即字符数)。例如:

  1. scanf("%5d",&a);

输入12345678只把12345赋予变量a,其余部分被截去。又如:

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

输入12345678将把1234赋予a,而把5678赋予b。

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

使用scanf函数还必须注意以下几点:

  1. scanf函数中没有精度控制,如:scanf("%5.2f",&a);是非法的。不能企图用此语句输入小数为2位的实数。
  2. scanf中要求给出变量地址,如给出变量名则会出错。如 scanf("%d",a);是非法的,应改为scnaf("%d",&a);才是合法的。
  3. 在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。
  4. 在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。

例如:

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

输入 d、e、f 则把‘d‘赋予a,‘ ‘ 赋予b,‘e‘赋予c。只有当输入为 def 时,才能把‘d‘赋于a,‘e‘赋予b,‘f‘赋予c。

如果在格式控制中加入空格作为间隔,如:

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

则输入时各数据之间可加空格。

【例4-8】

  1. #include <stdio.h>
  2. int main(void){
  3. char a,b;
  4. printf("input character a,b\n");
  5. scanf("%c%c",&a,&b);
  6. printf("%c%c\n",a,b);
  7. return 0;
  8. }

由于scanf函数"%c%c"中没有空格,输入M  N,结果输出只有M。而输入改为MN时则可输出MN两字符。

【例4-9】

  1. #include <stdio.h>
  2. int main(void){
  3. char a,b;
  4. printf("input character a,b\n");
  5. scanf("%c %c",&a,&b);
  6. printf("\n%c%c\n",a,b);
  7. return 0;
  8. }

本例表示scanf格式控制串"%c %c"之间有空格时,输入的数据之间可以有空格间隔。

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

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

其中用非格式符“ , ”作间隔符,故输入时应为:5,6,7。又如:

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

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

6) 如输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确。

【例4-10】

  1. #include <stdio.h>
  2. int main(void){
  3. int a;
  4. printf("input a number\n");
  5. scanf("%d",&a);
  6. printf("%ld",a);
  7. return 0;
  8. }

由于输入数据类型为整型,而输出语句的格式串中说明为长整型,因此输出结果和输入数据不符。如改动程序如下(【例4-11】):

  1. #include <stdio.h>
  2. int main(void){
  3. long a;
  4. printf("input a long integer\n");
  5. scanf("%ld",&a);
  6. printf("%ld",a);
  7. return 0;
  8. }

运行结果为:
input a long integer
1234567890
1234567890

当输入数据改为长整型后,输入输出数据相等。

【例4-12】

  1. #include <stdio.h>
  2. int main(void){
  3. char a,b,c;
  4. printf("input character a,b,c\n");
  5. scanf("%c %c %c",&a,&b,&c);
  6. printf("%d,%d,%d\n%c,%c,%c\n",a,b,c,a-32,b-32,c-32);
  7. return 0;
  8. }

输入三个小写字母,输出其ASCII码和对应的大写字母。

【例4-13】

  1. #include <stdio.h>
  2. int main(void){
  3. int a;
  4. long b;
  5. float f;
  6. double d;
  7. char c;
  8. printf("\nint:%d\nlong:%d\nfloat:%d\ndouble:%d\nchar:%d\n",sizeof(a),sizeof(b),sizeof(f),sizeof(d),sizeof(c));
  9. return 0;
  10. }

输出各种数据类型的字节长度。

时间: 2024-08-02 06:06:57

[转]scanf的相关文章

VS2015使用scanf报错的解决方案

1.在程序最前面加: #define _CRT_SECURE_NO_DEPRECATE 2.在程序最前面加: #pragma warning(disable:4996) 3.把scanf改为scanf_s: 4.无需在程序最前面加那行代码,只需在新建项目时取消勾选"SDL检查"即可: 5.若项目已建立好,在项目属性里关闭SDL也行:我用的VS是中文版的 (1).我将"是"改为"否",编译同样的代码时出现了如下的警告,不是报错: (2).如果不改,

当scanf接收单字符遇上循环

╮(╯▽╰)╭,没想到有一天自己也能就某个标准库函数,谈谈它的某个缺陷. 但我了解,只要有了这开始,"想必是极好的". 这个问题是之前在写一个数据结构的程序时遇到的.现在简化了一下,与大家分享, 一直挺赞同这句话的"Talk is cheap,show me the code". So 代码来了. 下面的代码是有问题的,就是scanf在循环第二次的时候,"%c"接收到的数据不是我们输入的数据,而是换行符. #include <stdio.h

scanf函数用法小记

By francis_hao    Aug 26,2017 scanf – 输入格式转换 概述 #include <stdio.h>int scanf(const char *format, ...); 描述 该函数通过format扫描标准输入stdin, format包含转换描述说明,如果需要转换,那么转换后的结果存储在format之后的指针参数中,每个指针参数类型必须要正确对应转换说明.如果format中转换说明符的个数,超过了后面的指针参数,那么结果将是未定义的.反过来,如果指针参数的数

scanf() gets() fgets()使用注意事项

1.scanf() 遇到'\n'停止从输入缓冲区中接收,接收完后'\n'还存在于缓冲区中.当输入的字符数少于缓冲区大小时,字符后面有自动补上'\0',当输入字符大于缓冲区时,也直接拷贝到缓冲中,因此缓冲区大小应注意以免产生段错误. 2.gets() 当输入的字符串低于缓冲区长度时,以'\n''\0'结尾,此时缓冲区中什么也没留下:当输入的字符串大于缓冲区长度时,也会全部存入缓冲区中,注意缓冲区大小以免产生段错误,此时缓冲区中什么也没留下. 3.fgets() 从文件字节流中获取指定长度的字符串并

窗口迅速关闭的解决办法/scanf/if/for/break

break if的格式 if(a>b) { printf("max=%d\n",a); } else printf("max=%d\n",b); scanf("%s", str2); 窗口迅速关闭的解决办法 刚接触 Visual Studio的时候大多数人会写个Hello World的程序试一下,有的人会发现执行结束后输出窗口会一闪而过,并没有出现Press any key to continue的字样.无论是在Visual Studio

c语言scanf详解

函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]);scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息.可以读入任何固有类型的数据并自动把数值变换成适当的机内格式.其调用格式为:      scanf("<格式化字符串>",<地址表>);scanf()函数返回成功赋值的数据项数,出错时则返回EOF.其控制串由三类字符构成:1.格式化说明符: 2.

eclipse 中 scanf 先于printf 出现的问题

原文:http://blog.csdn.net/linux_wgl/article/details/7430561 在写一个C语言时,运行时发现scanf比printf先执行了,在网上找了一下资料,原来是输出缓冲区的问题.解决方法有两个,第一,设置缓冲区为空,即没有缓冲区:第二,每执行printf之后,强制缓冲区.具体方法如下: 在printf之前添加:setvbuf(stdout,NULL,_IONBF,0);设置缓冲区为空. 在每句printf之后添加:fflush(stdout); 测试代

神奇的scanf

神奇的scanf 作为标准输入输出函数组中的一个重要的输入的函数,scanf/sscanf/vscanf函数和printf/sprintf/vsprintf有个重要的区别:如果格式参数和后面的参数不匹配,printf系列函数可能会导致打印出的格式或者数据不是自己期望的 ,而scanf系列函数如果格式参数和后面的参数不匹配,可能导致有待输入的参数附近的内存发生变化,甚至导致程序崩溃. 以下面的函数为例: 8 #include<stdio.h> 9 #include<string.h>

C语言杂谈(一)scanf()、scanf_s()与错误 C4996

错误 C4996 初学C语言时,第一个接触到的I/O函数便是scanf()了.但在高版本的 Visual Studio (包括但不限于2015.2013.2012)编译代码时,却会出现意想不到的错误.有如下一段简单的代码: #include "stdio.h" int main(void) { int i; printf("Input i\n"); scanf("%d", &i); printf("i is %d",

scanf函数

变量的内存:字节和地址:1.变量的存储单位是字节,每个字节都有存储地址.2.不同的数据大小占用的内存带下不同拥有的字节数也是不同的.变量的存储:1.存储是按照,先存储的放在地址教高的位置,优先存储的地址越大,存储地址用十六进制表示.2.&是取址运算符,用来获取地址.%p这个占位符用来输出地址.3.由于c语言弱语言性质,导致未初始化的变量不会报错,所以要注意变量的初始化.scanf函数说是stadio.h自带函数,用于提醒用户进行输入操作.注意:scanf只能输入变量地址,&变量名Scanf