scanf函数详细讲解

(1)简介

scanf函数是c语言当中非常重要的格式化输入函数

其函数原型为:int scanf(const char *format, ...);

其函数返回值:成功格式化解析的个数

其调用格式为:scanf("<格式化字符串>", <参量表>);

(2)转换说明:

转换格式为:%[*][宽度][类型长度]类型

除了最后的类型之外都是可选的字段

转换修饰符
修饰符 意义
* 滞后赋值;示例:"%*d"
digit(s) z最大字段宽度;在达到最大字段宽度或者遇到第一个空白字符时(不管哪个先发生都一样)停止对输入项的读取;示例:"%10s"
hh b把整数读作signed char或unsigned char;示例:"%hhd" "%hhu"
ll b把整数读作long long或unsigned long long(c99);示例:"%lld" "%llu"
h,l或L "%hd"和"%hi"指示该值将会储存在一个short int中。"%ho"、"%hx"和"%hu"指示该值将会储存在一个unsigned short int中。"%ld"和"%li"指示该值将会储存在一个long中。"%lo"、"%lx"和"%lu"指示该值将会储存在一个unsigned long中。"%le"、"%lf"和"%lg"指示该值以double类型储存。将L(而非l)与e、f和g一起使用指示该值以long double类型储存。如果没有这些修饰符,d、i、o和x指示int类型,而e、f和g指示float类型;
转换说明符
转换说明符 意义
%c 把输入解释称一个字符
%d 把输入解释称一个有符号十进制整数
%e,%f,%g,%a 把输入解释称一个浮点数(%a是c99标准)
%E,%F,%G,%A 把输入解释称一个浮点数(%A是c99标准)
%i 把输入解释称一个有符号十进制整数
%o 把输入解释称一个有符号八进制整数
%p 把输入解释称一个指针(一个地址)
%s 把输入解释称一个字符串,输入内容以第一个非空白字符作为开始,并且包含直到下一个空白字符的全部字符
%u 把输入解释称一个无符号十进制整数
%x,%X 把输入解释称一个无符号十六进制整数
[] 字符集合

(3)高级用法:

网上已经有很多博客将scanf的常用方法说的非常详细了,本篇博客不再详细介绍。

1。捕获规则

在出现一个转换说明符时,scanf函数会忽略前面的所有空白字符(除了%c),然后再捕获相应的数据类型,一直到最大长度或者出现空白字符

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

允许的输入格式为:1,2\n;1,  2\n;1,\n2\n;

不允许的输入格式:1 ,2\n;   \n1,2\n; 1,2\n;

2。%[] 字符集合

这个算scanf函数中比较高级一点的用法

[]里面填写需要捕获的字符集合,例如

char buf[20];

scanf("%[abc]", buf);  //输入abcdabcd123, buf内容为abc

scanf函数匹配[]中的所有字符,直到找到一个非[]中的字符

[]中也可以填写字符范围,例如

[a-z] //捕获包括字符从a到z的所有字符,直到找到一个非a-z的字符

[a-zA-Z] //捕获所有字母

[0-9] //捕获所有数字

[a-zA-Z0-9]捕获所有字母和数字

[a-zA-Z0-9!]捕获所有字母和数字并且捕获!(感叹号)

[]中如果第一字符为^符号则表示出现[]中的内容则停止捕获,例如

[^a-zA-Z]捕获非字母

[^0-9]捕获非数字

3。scanf中的空格和\n

scanf中的空格的作用不仅仅是捕获一个空格,它表示捕获所有空白字符(空格,换行,制表符等)直到出现一个非空白字符(\n一样),例如

我们想接受一个ip:端口的输入

需要接受的输入格式为:ip:端口,ip: 端口,ip : 端口,ip\n:\n端口

如果代码为scanf("%d.%d.%d.%d:%d", &ip[0], &ip[1], &ip[2], &ip[3], &port);

则只能捕获的格式:ip:端口,ip: 端口,ip:\n端口

如果我们将代码改为scanf("%d.%d.%d.%d :%d", &ip[0], &ip[1], &ip[2], &ip[3], &port); // : 前面多了一个空格

则可以捕获上述所有情况

4。scanf中的混合输入字符和数字

在scanf当中混合输入字符和数字是一个比较烦人的问题

如果我们直接编写代码为

 1 #include <stdio.h>
 2
 3 int main() {
 4     char ch;
 5     int num;
 6
 7     while(scanf("%c%d", &ch, &num) == 2) {
 8         printf("*%c*, *%d*\n", ch, num);
 9     }
10     return 0;
11 }

第一次scanf("%c%d");没有任何问题

第二次scanf("%c%d");字符会将上一次的\n给解析进来,就会出现了问题

解决方案1:

#include <stdio.h>

int main() {
    char ch;
    int num;

    while(scanf("%c%d", &ch, &num) == 2) {
        printf("*%c*, *%d*\n", ch, num);

        while(getchar() != ‘\n‘); //清除上次输入残留的\n
    }
    return 0;
}

解决方案2:

#include <stdio.h>

int main() {
    char ch;
    int num;

    while(scanf(" %c%d", &ch, &num) == 2) { //前面加一个空格忽略所有空白字符
        printf("*%c*, *%d*\n", ch, num);
    }
    return 0;
}

未定义的方案(官方文档未定义,勿用):

#include <stdio.h>

int main() {
    char ch;
    int num;

    while(scanf("%c%d", &ch, &num) == 2) {
        printf("*%c*, *%d*\n", ch, num);
        fflush(stdin); //flush标准输入流
    }
    return 0;
}

原文地址:https://www.cnblogs.com/windpiaoxue/p/9184194.html

时间: 2024-09-29 17:17:26

scanf函数详细讲解的相关文章

C语言scanf函数详细解释(转)

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

C语言scanf函数详细解释

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

scanf函数简单讲解

在C语言中,scanf函数用来接收控制台输入的数据,包括数字.字符.汉字.字母等.其首先将从键盘或触摸屏接收到的数据存放到内存中,然后严格按照scanf函数中""的内容将相应的数据存到""后面的地址中(如&a是将相应的数据存到以&a为地址的内存中).scanf函数中的""内容分为非格式控制符(如符号等)和格式控制符(如%d.%c.%f.%lf等).非格式控制符必须原样输入(\n的输入不是按Enter键,而是输入\n),格式控制符会

printf函数详细讲解

(1)简介: printf函数是c语言当中非常重要的格式化输出函数 其函数原型为:int printf(const char *format, ...); 其函数返回值:打印出的字符格式 其调用格式为:printf("<格式化字符串>", <参量表>); (2)转换说明: 转换格式为:%[标志][宽度][.精度][类型长度]类型 除了最后的类型之外都是可选的字段 标志 标志  意义 - 项目是左对齐的:也就是说,会把项目打印在字段的左侧开始处.示例:"

《The Swift Programming Language 》——函数 使用方法详细讲解

函数是用来完成特定任务的独立的代码块.你给一个函数起一个合适的名字,用来标示函数做什么,并且当函数需要执行的时候,这个名字会被"调用". Swift 统一的函数语法足够灵活,可以用来表示任何函数,包括从最简单的没有参数名字的 C 风格函数,到复杂的带局部和外部参数名的 Objective-C 风格函数.参数可以提供默认值,以简化函数调用.参数也可以即当做传入参数,也当做传出参数,也就是说,一旦函数执行结束,传入的参数值可以被修改. 在 Swift 中,每个函数都有一种类型,包括函数的参

[iOS]数据库第三方框架FMDB详细讲解

[iOS]数据库第三方框架FMDB详细讲解 初识FMDB iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较麻烦.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepersistentobjects等. FMDB是一款简洁.易用的封装库.因此,在这里推荐使用第三方框架FMDB,它是对libsqlite3框架的封装,用起来的步骤与SQLite使用类似,并且它对于多线程的并发操作进行了处理,所以

黑 马 程 序 员_视频学习总结&lt;c语言&gt;----02 printf和scanf函数、基本语句和运算、流程控制、函数、数组、字符串

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.printf函数 1.在使用peintf函数前必须加入#include <stdio.h>,使用它可以向标准输出设备(比如屏幕)输出数据,其中使用格式是 printf(“字符串”) :或者 printf(“字符串”, 格式符参数): 2.常用的格式符及其含义如图所示 3.格式符还可以添加输出宽度 二.scanf函数 1.在使用scanf函

Android自定义相机超详细讲解

Android自定义相机超详细讲解 转载请标明出处: http://blog.csdn.net/vinicolor/article/details/49642861: 由于网上关于Android自定义相机的文章写得不是太详细,Google官方的文档又说得不太容易理解,所以今天我来详细讲解一下Android自定义相机. 这篇文章主要写给一些刚刚接触Android的那些看官方API困难以及不太了解Android机制的同学们,所以熟练开发者可以绕道了. 最近在使用Camera类的时候发现居然被弃用了,

C语言之可变参实现scanf函数

既然有printf函数可变参实现,那就一定有scanf函数的可变参实现.废话不多说,源码奉上: 本源码不过多分析,如要明白原理,请翻本博客以往的文章看说明. 欢迎关注新浪微博:http://weibo.com/u/1896293701/home?topnav=1&wvr=6 #include <stdio.h> #include <stdarg.h> int myscanf(const char *fmt , ...) ; int main(void) { int num