文档章节

scanf中的%[^\n]%*c格式 正则用法

X
 XMLi
发布于 2016/10/08 22:03
字数 1115
阅读 347
收藏 0

scanf 
语法: 
  #include <stdio.h>
  int scanf( const char *format, ... );
 类似函数有
       int scanf(const char *format, ...);
       int fscanf(FILE *stream, const char *format, ...);//指定输入流
       int sscanf(const char *str, const char *format, ...);//指定缓存区
scanf()函数根据由format(格式)指定的格式从stdin(标准输入)读取,并保存数据到其它参数. 它和printf()有点类似. format(格式)字符串由控制字符,空白字符和非空白字符组成. 控制字符以一个%符号开始,如下:

控制字符 说明 
%c 一个单一的字符 
%d 一个十进制整数 
%i 一个整数 
%e, %f, %g 一个浮点数 
%o 一个八进制数 
%s 一个字符串 
%x 一个十六进制数 
%p 一个指针 
%n 一个等于读取字符数量的整数 
%u 一个无符号整数 
%[] 一个字符集 
%% 一个精度符号

1.scanf()读取匹配format(格式)字符串的输入. 当读取到一个控制字符, 它把值放置到下一个变量. 空白(tabs, 空格等等)会跳过. 非空白字符和输入匹配, 然后丢弃. 如果是一个在%符号和控制符间的数量, 那么只有指定数量的字符转换到变量中. 如果scanf()遇到一个字符集(用%[]控制字符表示), 那么在括号中的任意字符都会读取到变量中. scanf()的返回值是成功赋值的变量数量, 发生错误时返回EOF. 
2.scanf()函数的一般格式为:scanf("格式字符串",输入项首地址表)
3.scanf的格式控制的一般形式为:%[*][宽度][F|N][h|l]类型字符
[]中的控制字符为可选项 
4."*"表示该输入项读入后不赋予任何变量,即跳过该输入值。
5."宽度"表示输入读入字符的长度,对于整型表示截取相应宽度的数字赋给后面列表中的相应变量;对于字符型表示读入相应长度的字符后把第一个字符赋给相应的变量,其余的自动舍弃。例如scanf("-=",&a, &b);如果输入为12345则将12赋给a,将45赋给b;scanf(",<",&a, &b);如果输入为12345则将'1'赋给a,将'3'赋给b .
"%s" 整个输入作为一个串,并设置末尾的'\0'
"%ns",n为整数,读入的串最长不超过n,然后在末尾补'\0'
%nf 读入的浮点数最多有n位整数,位数多于n,会截断。
"%n[a-z]" 读入最多n个字符,如果遇到非a-z的字符,停止
"%[^=]" 读入任意多的字符,直到遇到"="停止
"%n[^=]" 读入"="号前的至多n 个字符
6.F 、N、h、l分别表示远指针、近指针、短整和长整型。
7.对于输入字符串还有一些比较有用的控制。
    例如经常需要读入一行字符串,而这串字符里面可能有空格、制表符等空白字符,如果直接用%s是不可以的,于是有些人就想到用gets(),当然这也是一种选择,但是懂C的人基本上都知道gets()是一个很危险的函数,而且很难控制,特别是与scanf()交替使用时前者的劣势更是一览无余,所以gets()一般是不推荐用的,其实用%[^\n]就可以很好的解决这个问题了,^表示"非",即读入其后面的字符就结束读入。这样想读入一行字符串直接用scanf("%[^\n]%*c",str);就可以了,
%*c的作用是读入\n,否则后面读入的将一直是\n。

所有对%s起作用的控制都可以用%[],比如%[0-9]表示只读入'0'到'9'之间的字符,%[a-zA-Z]表示只读入字母,
'-'是范围连接符,当然也可以直接列出你需要读入的字符。
如果你只需要读"abc"里面的字符就可以用%[abc] (或者%[cab]、%[acb]、%[a-c]、%[c-a].....),
如果想读入某个范围之外的字符串就在前面加一个'^',如:%[^a-z]就表示读入小写字母之外的字符。
例如从键盘输入的"1235ab86"中读取1235、86给n,有如下方法:

#include <stdio.h>
#include <stdbool.h>     //C99新增的头文件,支持原生的布尔类型

bool skip()                   
{
     scanf("%*[^0-9]");
     return 1;
}

int main()
{
      int n;
      while(skip() && scanf("%d", &n)!=EOF)
      {
          printf("%d\n", n);
      }
      return 0;
}


输出为:1235
        86

© 著作权归作者所有

X
粉丝 0
博文 21
码字总数 14994
作品 0
淮安
私信 提问
scanf()函数的用法和实践

scanf()函数的用法和实践 摘要: 本文阐述了基于ANSI,Win 95,Win NT上的 C/C++语言中scanf()函数的用法,以及在实际使用中常见错误及对策。 关键词: scanf() 一、 序言 在CSDN论坛的C/C++...

晨曦之光
2012/03/09
345
0
五、printf和scanf函数

说明:这个C语言专题,是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员,能够快速上手C语言。如果你还没有编程经验,或者对C语言、iOS开发不感兴趣,请忽略 一、printf函数 这...

长平狐
2013/03/28
205
0
小蚂蚁学习C语言(5)——C语言两个基本的输入输出函数printf()和scanf()

漫长的学习铺垫之后,终于到了学习C语言的正文阶段,我怀着无比鸡冻的心情学习了两个函数=_= 基本的输入和输出函数的用法 printf(); //输出 scanf(); //输入 我靠,听老师说,C语言基本上要学...

嗜学如命的小蚂蚁
2015/12/01
80
0
C 函数sscanf()的用法

sscanf() - 从一个字符串中读进与指定格式相符的数据.   函数原型: 说明:   sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。   其中...

吃一堑消化不良
2016/09/06
57
0
C语言scanf函数详细解释

函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类...

晨曦之光
2012/03/09
48.1K
1

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
5
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部