scanf()函数总结

基本说明


  • 功能: 按用户指定的格式从键盘上把数据输入到指定的变量之中。
  • 头文件:#include <stdio.h>
  • 标准格式:scanf("<控制串>",变量地址) 输入一个整数:scanf("%d",&a);
  • 返回值:scanf()函数返回成功赋值的数据项数,读到文件末尾出错时则返回EOF。(后面详解)

实例


返回值
scanf函数就是返回正确输入的数据个数,返回值int型,以下代码说明:

#include <stdio.h>
int main()
{
    int a,b,c;
    c=scanf("%d%d",&a,&b);
    printf("%d",c);
}
输入输出
1 22
1 a1
a b0

如果遇到错误或遇到end of file,返回值为EOF,所以经常见到

while(scanf("%d",&a)!=EOF)

控制串说明


控制串有三种类型:格式说明符(也是最常用的)、空白符,非空白符

1.经常使用的格式说明符就不多说了,比如输入一个整数一个字符

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

比如键入 1x 那么就将1赋值给变量a 将’x’赋值给变量c。


2.空白符


空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符。
其中空白字符包括space,tab,newline等等。比如

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

若输入10 20 则就将10赋给a ,20 赋给b , 输入时候的空格则忽略;
注:如果格式是字符 char的话,空格或者转义字符会被当做普通字符:

int a;char c;
scanf("%d%c",&a,&c);
printf("%d%c",a,c);

若输入10 a 输出将会是10 而不是10 a 这是因为空格赋值给了c
'a' 则继续留在缓冲区内,如果再下面再加一句scanf("%c",&c) (不用再次输入),那么此时c的值就是'a'
本质上,控制串中的空白符使 scanf() 在输入流中读,但不保存结果,直到发现非空白字符为止。

3.非空白符[过滤]


非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符;这个在实际应用中挺常用的;
1,比如我想输入的字符串是’a=2 b=3’,而且还需要将a,b赋值成2,3,,可以这样实现。

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

这样输入的时候直接输入a=2b=3 scanf()就会自动剔除掉不需要的字符,而将2赋值给a,3赋值给b
这里空格space,同样可以使用

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

这样同样可以实现空格输入:输入10 20 同,space将相当于一个普通字符。
2, 宽度设置
在百分号(%)与格式码之间的整数用于限制从对应域读入的最大字符数。例如,希望向name 读入不多于 10个字符时,可以书写成如下形式:

scanf("%10s",name);

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

3,省略指定的数据类型*符号
比如

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

比如输入10a20,得到的是a=10,b=20
再如

char c[20];
scanf("%*s%s",&c);
printf("%s",c);

若输入"hello, world" 则会输出world 因为world之前的space终止了%*s.
注:%是选择满足条件的,%* 是过滤掉满足条件的。可以配合下面所说的扫描集使用。


4.scanf的”正则表达式”—扫描集
扫描集定义一个字符集合,可由 scanf() 读入其中允许的字符并赋给对应字符数组。 扫描集合由一对方括号中的一串字符定义,左方括号前必须缀以百分号。
遇到不属于扫描集的结束;有点像正则表达式,其实用法也很类似。
比如 :

char s[10];
scanf("%[abc]",s);
输入输出
abcabc
bcbc
abdfab
abdcbab

就类似一个过滤。
下面是一些常用符号:
- ^表示补集: %[^abc] 遇到abc停止
- ‘-‘表示区间: %[A-Z] A-Z范围
- %[^\n] 表示可以吸收空格,回车结束;

char s[10];
scanf("%s",s);
printf("%s",s);

比如输入的是'I love you'那么输出的s 是I, 而不是I love you
因为空格作为了分隔符。
而想要吸收空格可以用 扫描集

char s[10];
scanf("%[^\n]",s);
printf("%s",s);

表示只有输入回车才结束
此时再输入 I love you 将完整输出 I love you

再看一个例子:
要去出一个邮箱的域名,经常用正则,那么这里用scanf的该怎么使用呢?

char s[30];
scanf("%*[^@]@%[^\.]",s);
printf("%s",s);

这个可以 输入mymail@gmail.com 输出就会是 gmail;
首先分成三部分%*[^@]@%[^\.] ;
%*[^@] 表示过滤前面的不是@的部分,这部分读取到了mymail 但是不保存到变量 s。第二部分@ 是指过滤掉 缓存区中的 @ 字符。 最后一部分%[^\.] 则表示选择不是.的部分,对应字符串中的gmail部分,并且赋值给s。
注:
1. 在scanf()正则里面 最多只能有一个%表示选择。而过滤%*可以有多个
2. 上述所讲的正则规则 与sscanf()函数完全适用。只不过是输入方式不同。
其实 scanf()用正则比较少。sscanf()就比较常用了。很方便的处理字符串。


5.scanf()缓冲区问题总结

int a;
char c;
scanf("%d",&a);
scanf("%c",&c);
printf("a=%d  c=%c",a,c);

比如输入20 a 那么输出将会是 20和一个空格[前面已经提到过]
如果打算想 输入20之后 回车再输入’a’ 结果会是输入回车之后 就会输出。这时候如果输入c的ASCII码值就会发现是 10 正好是\n
这样就对了,\n被scanf()函数“错误”地赋给了c;
常见的解决方法:
1. 在第一个scanf()之后加入getchar()函数可以消掉回车。具体原理还不太懂。。
2. 还有就是利用fflush(stdin); 刷新或者清空缓冲区,这样输入一个20之后 按回车的话就可以,继续输入字符 赋值给c,如下:

#include <stdio.h>
int main()
{
    int a,b;
    char c;
    scanf("%d",&a);
    fflush(stdin);
    scanf("%c",&c);
    printf("a=%d c=%d\n",a,c);
}

这样就可以了。

上面是学了以scanf的一些总结, 虽然平时使用的很简单,但是总感觉不太踏实,因为总时不时的出错。这次记录一下学习收获挺大的。

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
1. 程序结构是三种: 顺序结构 、选择结构(分支结构)、循环结构。 2. 读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择),有且只有一个main函数。 3. 是构成C语言程序的基本单位。 4. 计算机的数据在电脑中保存是以 二进制的形式. 数据存放的位置就是 他的地址. 5. bit是位 是指为0 或者1。 byte 是指字节, 一个字节 = 八个位. 概念常考到的: 1、编译预处理不是C语言的一部分,不占运行时间,不要加分号。C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中,一定不能出现分号,源程序扩展名为.c,目标文件扩展名.obj,可执行文件扩展名.exe。 2、每个C语言程序中main函数是有且只有一个。 3、在函数中不可以再定义函数。 4、算法:可以没有输入,但是一定要有输出。 第一章 C语言的基础知识 第一节、对C语言的基础认识 1、C语言编写的程序称为源程序,又称为编译单位。 2、C语言书写格式是自由的,每行可以写多个语句,可以写多行。 3、一个C语言程序有且只有一个main函数,是程序运行的起点。 第二节、 2、每个C语言程序写完后,都是先编译,后链接,最后运行。(.c---.obj---.exe)这个过程中注意.c和.obj文件时无法运行的,只有.exe文件才可以运行。(程序编辑-程序编译-程序连接-程序运行) 第三节、标识符 1、标识符(必考内容): 合法的要求是由字母,数字,下划线组成。有其它元素就错了。 并且第一个必须为字母或则是下划线。第一个为数字就错了 预定义标识符:背诵define scanf printf include 。记住预定义标识符可以做为用户标识符。 常用关键字:if for case break continue while do等不能作为用户标识符。 第五节:整数与实数 1)C语言只有八、十、十六进制,没有二进制。但是运行时候,所有的进制都要转换成二进制来进行处理。 a、C语言中的八进制规定要以0开头。(数码取值0-7)018的数值是非法的,八进制是没有8的,逢8进1。 b、C语言中的十六进制规定要以0x(X)开头。(数码取值0-9,a-f,A-F) C.十进制没前缀,数码取值0-9 2)小数的合法写法:C语言小数点两边有一个是零的话,可以不用写。小数点必须有 1.0在C语言中可写成1. 0.1在C语言中可以写成.1。 3)实型数据的合法形式: a、2.333e-1 就是合法的,且数据是2.333×10-1。 b、考试口诀:e前e后必有数,e后必为整数。请结合书上的例子。 4) 整型,单精度一般是4个字节, 字符型是1个字节,双精度一般是8个字节:   long int x; 表示x是长整型。 unsigned int x; 表示x是无符号整型。 第六、七节:算术表达式和赋值表达式 核心:表达式一定有数值! 1、算术表达式:+,-,*,/,% 考试一定要注意:“/” 两边都是整型的话,结果就是一个整型。 3/2的结果就是1. “/” 如果有一边是小数,那么结果就是小数。 3/2.0的结果就是0.5 “%”符号请一定要注意是余数,考试最容易算成了除号。)%符号两边要求是整数。不是整数就错了。[注意!!!] 2、赋值表达式:表达式数值是最左边的数值,a=b=5;该表达式为5,常量不可以赋值。 1、int x=y=10: 错啦,定义时,不可以连续赋值。 2、int x,y; x=y=10; 对滴,定义完成后,可以连续赋值。 3、赋值的左边只能是一个变量。 4、int x=7.7;对滴,x就是7 5、float y=7;对滴,x就是7.0 3、复合的赋值表达式: int a=2; a*=2+3;运行完成后,a的值是12。 一定要注意,首先要在2+3的上面打上括号。变成(2+3)再运算。 4、自加表达式: 自加、自减表达式:假设a=5,++a(是为6), a++(为5); 运行的机理:++a 是先把变量的数值加上1,然后把得到的数值放到变量a中,然后再用这个++a表达式的数值为6,而a++是先用该表达式的数值为5,然后再把a的数值加上1为6, 再放到变量a中。 进行了++a和a++后 在下面的程序中再用到a的话都是变量a中的6了。 考试口诀:++在前先加后用,++在后先用后加。 x=a++;如果a=1运行完成后x=1;a=2; 5、逗号表达式: 优先级别最低。表达式的数值逗号最右边的那个表达式的数值。 (2,3,4)的表达式的数值就是4。 z=(2,3,4)(整个是赋值表达式) 这个时候z的值为4。(有点难度哦!) z= 2,3,4 (整个是逗号表达式)这个时候z的值为2。 补充: 1、空语句不可以随意执行,会导致逻辑错误。 2、注释是最近几年考试的重点,注释不是C语言,不占运行时间,没有分号。不可以嵌套! 3、强制类型转换: 一定是 (int)a 不是 int(a),注意类型上一定有括号的。 注意(int)(a+b) 和(int)a+b 的区别。 前是把a+b转型,后是把a转型再加b。 4、三种取整丢小数的情况: 1) int a =1.6; 2) (int)a;   3) 1/2; 3/2; 第八节、字符 1)字符数据的合法形式:: '1' 是字符占一个字节,"1"是字符串占两个字节(含有一个结束符号)。字符结束标志为’\0’   '0' 的ASCII数值表示为48,'a' 的ASCII数值是97,'A'的ASCII数值是65。 一般考试表示单个字符错误的形式:'65' "1"   字符是可以进行算术运算的,记住: '0'-0=48 大写字母和小写字母转换的方法: 'A'+32='a' 相互之间一般是相差32。 2)转义字符: 转义字符分为一般转义字符、八进制转义字符、十六进制转义字符。 一般转义字符:背诵\0、 \n、 \’、 \”、 \\。 八进制转义字符: ‘\141’ 是合法的, 前导的0是不能写的。 十六进制转义字符:’\x6d’ 才是合法的,前导的0不能写,并且x是小写。 3、字符型和整数是近亲:两个具有很大的相似之处    char a = 65 ;  printf(“%c”, a); 得到的输出结果:a printf(“%d”, a); 得到的输出结果:65 例2: 一定要记住,异或的位运算符号” ^ ”。0 异或 1得到1。 0 异或 0得到0。两个女的生不出来。 考试记忆方法:一男(1)一女(0)才可以生个小孩(1)。 例3: 在没有舍去数据的时候,<<左移一位表示乘以2;>>右移一位表示除以2。 
### 回答1: 好的,下面是使用scanf函数输入time的示例代码: ``` #include <stdio.h> #include <time.h> int main() { struct tm t; char input[80]; printf("请输入时间(格式:年-月-日 时:分:秒):"); scanf("%s", input); strptime(input, "%Y-%m-%d %H:%M:%S", &t); time_t timestamp = mktime(&t); printf("时间戳为:%ld\n", timestamp); return 0; } ``` 在上面的代码中,我们先定义了一个`struct tm`类型的结构体`t`,用来存储输入的时间。然后定义了一个字符数组`input`,用来存储从标准输入中读取的字符串。 接下来,使用`printf`函数提示用户输入时间,并使用`scanf`函数读取用户输入的字符串。 然后,使用`strptime`函数将输入的字符串转换为`struct tm`类型的结构体。`strptime`函数的第一个参数是要解析的字符串,第二个参数是解析字符串的格式,第三个参数是要存储解析结果的`struct tm`类型的结构体指针。 最后,使用`mktime`函数将`struct tm`类型的结构体转换为时间戳,并输出结果。 ### 回答2: 要调用scanf函数输入time,可按照以下步骤进行: 1. 在程序中包含头文件stdio.h,以便能够使用scanf函数。 2. 声明一个变量来存储输入的time。例如,可以使用int类型的变量time来表示时间。 3. 在程序中使用scanf函数来接收用户输入的时间。可以使用"%d"来指定输入的格式为整数。 4. 在调用scanf函数时,需要传入一个指向time变量的地址,以便将用户输入的值储存在该变量中。可以使用"&"操作符来获取time变量的地址。 下面是一个示例代码: ```c #include <stdio.h> int main() { int time; printf("请输入时间:"); scanf("%d", &time); printf("您输入的时间是:%d\n", time); return 0; } ``` 在上面的示例中,首先声明了一个int类型的变量time来存储时间。然后使用printf函数提示用户输入时间,并使用scanf函数来接收用户输入的时间值。最后,使用printf函数输出用户输入的时间。 ### 回答3: 调用scanf函数输入time的过程如下: scanf函数是C语言标准库中的一个输入函数,用于从标准输入(通常是键盘)读取输入数据。要使用scanf函数输入time,需要按照以下步骤进行操作: 1. 首先,需要在程序中包含头文件<stdio.h>,因为scanf函数的声明位于该头文件中。 2. 在代码中声明一个变量来存储输入的time,比如可以使用int类型的变量time来存储输入的值。 3. 使用scanf函数进行输入。可以使用以下格式字符串来读取输入的time:%d。其中,%d表示读取一个整数值。如果time不是整数类型,则需要使用相应的格式控制符进行读取。 4. 调用scanf函数时,使用以下语法:scanf("%d", &time)。在这里,%d表示读取一个整数值,并且&time表示time变量的地址,以便将读取的值存储到time变量中。 5. 当程序执行到scanf函数时,会等待用户在标准输入中输入一个整数值。输入完成后,按下回车键,scanf函数会将输入的值读取并存储到time变量中。 6. 在读取输入之前,可以输出一些提示信息,让用户知道他们需要输入的值是什么。比如可以使用printf函数输出:"请输入time的值:"。 7. 接下来,可以使用time变量来进行后续的操作,比如进行计算、输出等。 总结:调用scanf函数输入time的步骤包括:包含<stdio.h>头文件、声明一个适当类型的变量来存储输入的time、使用scanf函数以适当的格式字符串读取输入的time、使用&time将读取的值存储到time变量中。通过这些步骤,我们可以在C程序中使用scanf函数输入time。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值