在解释标题的用法之前,先看看其他的用法。
不知道你有没有看到过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)是什么意思?相关推荐

  1. C语言中(字符串)输入scanf()、gets()、fgets()以及getchar()、getc()函数的联系与区别

    scanf()函数的输入基于获取"单词",如果使用%s格式,字符串以第一个非空白字符开始读入,读到(但不包括)下一个空白字符(可以是空格.制表符或者换行符).使用scanf()把一 ...

  2. fprintf、printf、sprintf、fscanf、scanf、sscanf 格式化输入输出

    格式化输入输出 1.         fprintf(格式化输出数据至文件) 相关函数  printf,fscanf,vfprintf 表头文件  #include<stdio.h> 定义 ...

  3. scanf()函数的用法和实践

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

  4. scanf 接收 空格 输入_你需要知道的scanf函数用法

    scanf函数   上一节中我们讨论了,如何将整数,浮点数,字符串打印到屏幕上去.既然有输出,怎么能没有输入呢?这一节中,我们来介绍与printf相反的scanf函数.   scanf的功能是将键盘输 ...

  5. scanf(%s,a)和gets(a)的差别

    gets()和scanf()的区别在于输入的字符串是否中间有空格:对于前者,只有遇到"\n"时才停止输入,而对于后者,出现"\n"或空格都停止输入.

  6. C语言基础之--scanf函数

    写代码的时候,我们可以看得出,几乎每一个C程序都会包括输入输出.输入输出是程序中最基本的操作之一.C语言本身并不提供输入输出的语句,输入输出操作是由C标准函数库中的函数来实现的.今天就先说说输入:sc ...

  7. C语言中的scanf()函数介绍

    1.scanf函数:读取从键盘输入的数据 在C语言中,有多个函数可以从键盘获得用户输入: scanf():和 printf() 类似,scanf() 可以输入多种类型的数据 getchar().get ...

  8. scanf可不可以输入浮点型_数据的输入和输出

    一.基本数据类型C 的基本数据类型有 short.int.long.char.float.double 等.类型多且杂,学习时极易厌烦,这时建议使用思维导图来整理这些繁杂但有章的知识.做思维导图时首先 ...

  9. C 格式化的输入输出(printf scanf)

    - 左对齐 (默认右对齐) printf("%-9d\n",123); 123 printf("%9d\n",123);          123 printf ...

  10. C语言scanf fgets,C语言中输入函数(scanf()、fgets()和gets())的区别详解

    前言 大家都知道在C语言中,有三种主要的输入函数:scanf(),fgets()以及gets().他们的使用方法及注意事项如下: 1.scanf() 它是一种格式化的输入方式,可一次性按照规定的格式输 ...

最新文章

  1. 【Qt】ubuntu14.04+qt5.6+opencv2.4编程注意事项
  2. 关于IOS的屏幕适配(iPhone)——资源适配
  3. 【Whalepaper】CV论文研读 - You Only Look One-level Feature (YOLOF), CVPR2021
  4. iphone以旧换新活动_iPhone销量靠降价,安卓终于要赢了?
  5. OpenCV gapi模块实现幻灯片滑slides soble的实例(附完整代码)
  6. [你必须知道的css系列]第一回:丰富的利器:CSS选择符之通配符、类选择符、包含选择符、ID选择符...
  7. lvds传输距离标准_如何正确看待POE交换机150米、长距离250米传输
  8. java中hashset_Java HashSet – Java中的HashSet
  9. 2021-07-03图标,选择框
  10. java连接zookeeper服务器出现“KeeperErrorCode = ConnectionLoss for ...”
  11. 使用shinydashboard编写高级UI页面(1)
  12. 操作系统原理,Windows线程调度,引发线程调度的事件,Windows线程优先级,Windows时间配额,Windows线程调度策略,Windows优先级提升事件
  13. Java --人民币(RMB)小写/数字转换大写工具类
  14. 组策略 禁止用户策略下发到指定计算机,使用组策略禁止域用户运行特定程序...
  15. todo有android版本吗,高效todo手机app下载
  16. java pacs上传服务_有没有办法将DICOM数据发送到远程PACS服务器上的特定目录?
  17. 计算机锁定不能强制选项无法关机,win7系统1909无法关机只能强制关机重启的解决办法...
  18. 我研究我自己!苏炳添博士重磅论文:我怎么跑这么快?
  19. 2018世界杯所有场次记录
  20. 前端基础(四)_数据类型的强制转换

热门文章

  1. uedit上传视频时提示输入的视频地址有误,请检查后再试
  2. 信息技术的技术趋势和未来展望
  3. False Coin
  4. BCNF与3NF的区别例子
  5. latex积分号、求和、极限符号大小,上下标位置控制,行内公式显示行间公式效果
  6. 017 Vowels match
  7. 51单片机的堆栈指针(SP)
  8. Jquery 模糊匹配ID
  9. Android中的EditText属性说明
  10. 关于图像分割的预处理 transform