scanf(“%*[\n]%[^\n]“,s)是什么意思?
在解释标题的用法之前,先看看其他的用法。
不知道你有没有看到过scanf下面这样的用法:
// 来源:公众号【编程珠玑】
// 作者:守望先生
#include<stdio.h>
int main(void)
{char a[128] = {0};scanf("%[0-9]",a);printf("%s\n",a);return 0;
}
上面的代码什么意思呢?试一下几个输入输出:
示例0:
输入:13579
输出:13579
示例1:
输入:121abc
输出:121
示例2:
输入:shouwang123nb455
输出:
注意:这里输出不是123,如果想要输出123怎么办?请看后面丢弃特定字符部分。
看到这里,估计你已经看清套路了,没错,[0-9]表示scanf只读取0-9的字符,而如果遇到不在该范围内的字符,则停止,不再继续读取,就是前面我们看到的示例情况了。
scanf的[
scanf函数中,有一个不常被人注意的,就是[了。它用来扫描特定的字符集。如果它以^开头,表示扫描除了字符集以外的所有字符,否则就是前面我们看到的,只扫描读取指定字符。
scanf读取空字符
我们都知道,scanf在读取内容的时候,会跳过空字符,比如:
char s[128] = {0};
scanf("%s",s);
printf("%s\n",s);
假设输入为:
bianchengzhuji
那么输出将会是:
bianchengzhuji
注意,前面的空字符并没有读入到字符串s中,而是被跳过了。
那如果要读取空字符怎么办?很简单:
scanf("%[^\n]",s);
这里的意思就是说,除了换行符,其他字符都读入,也就是说前面的空字符也会被读取,就达到了我们的目的了。
忽略开头的换行符
如果我们一开始就按回车,你会发现,s什么都没有读入,如何忽略开始的换行呢?像下面这样就可以了:
// 来源:公众号【编程珠玑】
// 作者:守望先生
#include<stdio.h>
int main(void)
{char a[10] = {0};scanf("%*[\n]%[^\n]",a);printf("%s\n",a);
}
输入输出示例:
输入:[回车][回车]abc
输出:abc
输入时,按下两次回车,再输入其他字符,则最终会读取其他字符,而忽略开头的回车换行。我们知道,在scanf中,*是跳过相应的字符项,比如,跳过开头的两个数字:
// 来源:公众号【编程珠玑】
// 作者:守望先生
#include<stdio.h>
int main(void)
{int third = 0;scanf("%*d %*d %d",&third);printf("%d\n",third);return 0;
}
输入:
111 222 333
输出:
333
scanf会跳过前面的111和222,则会读取333,这个功能在读取文件获取特定列内容的时候很有用。同理,在前面的例子中%*[\n]即表示跳过换行,[^\n]则读取任意字符,直到遇到换行。
丢弃特定字符
最开始的例子中,如果开头是字母,即便想读取数字,也读取不到,那么如何跳过开头的字母呢?仿照刚刚讲的:
// 来源:公众号【编程珠玑】
// 作者:守望先生
#include<stdio.h>
int main(void)
{char a[128] = {0};scanf("%*[a-zA-Z]%[0-9]",a);printf("%s\n",a);return 0;
}
这样,开头的字母就会被丢弃。
读取指定长度的任意字符
char s[8] = {0};
scanf("%7s",s);
输入:
abcdefghij
输出:
abcdefg
这样可以避免缓冲区溢出。
总结
scanf是我们刚开始学习C就会接触的函数,除了基本的用法,今天的用法你是否曾经见过呢?
scanf读取内容会跳过开头的空白字符,遇到换行符或者不是目标字符时结束读取。当然,你不是没有办法,今天所分享的就是办法。当然了,很多时候,你可能会选择使用fgets,getchar之类的函数,无妨。
问题
// 来源:公众号【编程珠玑】
// 作者:守望先生
#include<stdio.h>
int main(void)
{int a = 0;int b = 0;scanf("%d%d",&a,&b);printf("%d %d\n",a,b);return 0;
}
输入:
abcd1234
输出会是什么?为什么?
原文地址:https://www.yanbinghu.com/2020/12/12/46629.html
来源:公众号【编程珠玑】
scanf(“%*[\n]%[^\n]“,s)是什么意思?相关推荐
- C语言中(字符串)输入scanf()、gets()、fgets()以及getchar()、getc()函数的联系与区别
scanf()函数的输入基于获取"单词",如果使用%s格式,字符串以第一个非空白字符开始读入,读到(但不包括)下一个空白字符(可以是空格.制表符或者换行符).使用scanf()把一 ...
- fprintf、printf、sprintf、fscanf、scanf、sscanf 格式化输入输出
格式化输入输出 1. fprintf(格式化输出数据至文件) 相关函数 printf,fscanf,vfprintf 表头文件 #include<stdio.h> 定义 ...
- scanf()函数的用法和实践
scanf()函数的用法和实践 摘要: 本文阐述了基于ANSI,Win 95,Win NT上的 C/C++语言中scanf()函数的用法,以及在实际使用中常见错误及对策. 关键词: scanf() 一 ...
- scanf 接收 空格 输入_你需要知道的scanf函数用法
scanf函数 上一节中我们讨论了,如何将整数,浮点数,字符串打印到屏幕上去.既然有输出,怎么能没有输入呢?这一节中,我们来介绍与printf相反的scanf函数. scanf的功能是将键盘输 ...
- scanf(%s,a)和gets(a)的差别
gets()和scanf()的区别在于输入的字符串是否中间有空格:对于前者,只有遇到"\n"时才停止输入,而对于后者,出现"\n"或空格都停止输入.
- C语言基础之--scanf函数
写代码的时候,我们可以看得出,几乎每一个C程序都会包括输入输出.输入输出是程序中最基本的操作之一.C语言本身并不提供输入输出的语句,输入输出操作是由C标准函数库中的函数来实现的.今天就先说说输入:sc ...
- C语言中的scanf()函数介绍
1.scanf函数:读取从键盘输入的数据 在C语言中,有多个函数可以从键盘获得用户输入: scanf():和 printf() 类似,scanf() 可以输入多种类型的数据 getchar().get ...
- scanf可不可以输入浮点型_数据的输入和输出
一.基本数据类型C 的基本数据类型有 short.int.long.char.float.double 等.类型多且杂,学习时极易厌烦,这时建议使用思维导图来整理这些繁杂但有章的知识.做思维导图时首先 ...
- C 格式化的输入输出(printf scanf)
- 左对齐 (默认右对齐) printf("%-9d\n",123); 123 printf("%9d\n",123); 123 printf ...
- C语言scanf fgets,C语言中输入函数(scanf()、fgets()和gets())的区别详解
前言 大家都知道在C语言中,有三种主要的输入函数:scanf(),fgets()以及gets().他们的使用方法及注意事项如下: 1.scanf() 它是一种格式化的输入方式,可一次性按照规定的格式输 ...
最新文章
- 【Qt】ubuntu14.04+qt5.6+opencv2.4编程注意事项
- 关于IOS的屏幕适配(iPhone)——资源适配
- 【Whalepaper】CV论文研读 - You Only Look One-level Feature (YOLOF), CVPR2021
- iphone以旧换新活动_iPhone销量靠降价,安卓终于要赢了?
- OpenCV gapi模块实现幻灯片滑slides soble的实例(附完整代码)
- [你必须知道的css系列]第一回:丰富的利器:CSS选择符之通配符、类选择符、包含选择符、ID选择符...
- lvds传输距离标准_如何正确看待POE交换机150米、长距离250米传输
- java中hashset_Java HashSet – Java中的HashSet
- 2021-07-03图标,选择框
- java连接zookeeper服务器出现“KeeperErrorCode = ConnectionLoss for ...”
- 使用shinydashboard编写高级UI页面(1)
- 操作系统原理,Windows线程调度,引发线程调度的事件,Windows线程优先级,Windows时间配额,Windows线程调度策略,Windows优先级提升事件
- Java --人民币(RMB)小写/数字转换大写工具类
- 组策略 禁止用户策略下发到指定计算机,使用组策略禁止域用户运行特定程序...
- todo有android版本吗,高效todo手机app下载
- java pacs上传服务_有没有办法将DICOM数据发送到远程PACS服务器上的特定目录?
- 计算机锁定不能强制选项无法关机,win7系统1909无法关机只能强制关机重启的解决办法...
- 我研究我自己!苏炳添博士重磅论文:我怎么跑这么快?
- 2018世界杯所有场次记录
- 前端基础(四)_数据类型的强制转换