《C和指针》笔记6:gets/puts/scanf/printf/getchar函数用法

这篇具有很好参考价值的文章主要介绍了《C和指针》笔记6:gets/puts/scanf/printf/getchar函数用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本博客可以了解一些gets/puts/scanf/printf/getchar函数的基本用法。

1. gets函数

gets函数从标准输入读取一行文本并把它存储于作为参数传递给它的数组中。一行输入由一串字符组成,以一个换行符(newline)结尾gets函数丢弃换行符,并在该行的末尾存储一个NUL字节(一个NUL字节是指字节模式为全0的字节,类似’\0’这样的字符常量)。然后,gets函数返回一个非NULL值,表示该行已被成功读取。当gets函数被调用但事实上不存在输入行时,它就返回NULL值,表示它到达了输入的末尾(文件尾)。

字符串就是一个以NUL字节结尾的字符。NUL是作为字符串终止符,如"Hello"在内存中占据6个字节的空间,按顺序分别是H、e、l、l、o和NUL。

gets常常按下面使用,读取一行以后进行相应的操作。

while( gets( input ) != NULL )
{
	//操作
}

2. puts函数

puts函数是gets函数的输出版本,它把指定的字符串写到标准输出并在末尾添上一个换行符。例如输出一行字符串:

puts( "Last column number is not paired." );

3. scanf函数

scanf函数接受几个参数,其中第1个参数是一个格式字符串(如%s),用于描述期望的输入类型。剩余几个参数都是变量,用于存储函数所读取的输入数据。scanf函数的返回值是函数成功转换并存储于参数中的值的个数。

例子

定义一个数组array和一个整型数number。

int array[5];
int number;

由于scanf函数的实现原理,所有标量参数的前面必须加上一个“&”符号。数组参数前面不需要加上“&”符号,它本身代表第一个数组元素的地址。

scanf("%d", array);

但是,数组参数中如果出现了下标引用,也就是说实际参数是数组的某个特定元素,那么它的前面也必须加上“&”符号。

scanf("%d", &array[2]);

格式码%d表示需要读取一个整型值。字符是从标准输入读取,前面的空白将被跳过。然后这些数字被转换为一个整数,结果存储于指定的数组元素中。我们需要在参数前加上一个“&”符号,因为数组下标选择的是一个单一的数组元素,它是一个标量。

输入的number也是一个特定的元素,也要加上“&”符号。

scanf("%d", &number);

使用所有格式码(除了%c之外)时,输入值之前的空白(空格、制表符、换行符等)会被跳过,值后面的空白(空格、制表符、换行符等)表示该值的结束。因此,%s格式码输入字符串时,中间不能包含空白。除了表中所列之外,还存在许多格式代码,但这张表里面的这几个格式代码对于应付我们现在的需求已经足够了。

scanf函数每次调用时都从标准输入读取一个符合格式码的输入字符。如果转换失败,不管是因为文件已经读完还是因为下一次输入的字符无法转换为符合格式码的数据,函数都会返回0,这样就会使整个循环终止。如果输入的字符可以合法地转换为符合格式码的数据,那么这个值就会转换为二进制数存储于变量元素中。然后,scanf函数返回1。

scanf常见的格式码

格式码 含义 数据类型
%d 整型 int
%ld 长整型 long
%f 单精度浮点型 float
%lf 双精度浮点型 double
%c 字符 char
%s 字符串 char型数组

4. printf函数

printf函数接受多个参数,其中第一个参数是一个字符串,描述输出的格式,剩余的参数就是需要打印的值。格式常常以字符串常量的形式出现。

例如:

char input = 'a';
printf( "Original input : %c\n", input);

结果是:

Original input : a

printf常见的格式码

格式码 含义 数据类型
%d 十进制整型 int
%o 八进制整型 int
%x 十六进制整型 long
%g 浮点值 float
%s 字符串 char型数组

5. getchar函数

getchar函数从标准输入读取一个字符并返回它的值。如果输入中不再存在任何字符,函数就会返回常量EOF(在stdio.h中定义),用于提示文件的结尾。

我们可以这样写:

ch = getchar();
while( ch != EOF && CH != '\n' )
	ch = getchar();

上面的语句将读取一个字符,接下来如果我们尚未到达文件的末尾或读取的字符并不是换行符,它将继续读取下一个字符。从getchar函数返回的值被赋给变量ch,然后把它与EOF进行比较。在赋值表达式两端加上括号用于确保赋值操作先于比较操作进行。如果ch等于EOF,整个表达式的值就为假,循环将终止。若非如此,再把ch与换行符进行比较,如果两者相等,循环也将终止。因此,只有当输入尚未到达文件尾并且输入的字符并非换行符时,表达式的值才是真的(循环将继续执行)。这样,这个循环就能剔除当前输入行最后的剩余字符。

注意出现了两次下面的语句:

int ch;
ch = getchar();

C语言可以把赋值操作蕴含于while语句内部,这样就允许程序员消除冗余语句。

于是我们可以这样改写:

while( (ch = getchar()) != EOF && ch != '\n' )
;

while语句之后的单独一个分号称为空语句 (empty statement),它就是应用于目前这个场合,也就是语法要求这个地方出现一条语句但又无需执行任何任务的时候。这个分号独占一行,这是为了防止被错误地以为接下来的语句也是循环体的一部分。

Q:为什么ch被声明为整型,而我们事实上需要它来读取字符?

因为EOF是一个整型值,它的位数比字符类型要多,把ch声明为整型可以防止从输入读取的字符意外地被解释为EOF。但同时,这也意味着接收字符的ch必须足够大,足以容纳EOF,这就是ch使用整型值的原因。

6. putchar函数

它与getchar函数相对应,它接受一个整型参数,并在标准输出中打印该字符(如前所述,字符在本质上也是整型)。


7. getline函数

补充一下getline函数,这也是一个常见的函数,如果我们要读取一行(回车算一行的结束),可以使用这个函数,只读取一行,常见的写法

while ((char c = getline()) != '\n')
{
//Code
}

另外getline也可以接收参数,如在C++里,可以这样写:

string name;
getline(cin, name);

此函数可读取整行,包括前导和嵌入的空格,并将其存储在字符串对象中。其中 cin 是正在读取的输入流,而 name是接收输入字符串的 string 变量的名称。

参考文章来源地址https://www.toymoban.com/news/detail-674246.html

  1. 《C和指针》

到了这里,关于《C和指针》笔记6:gets/puts/scanf/printf/getchar函数用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于【C语言】中scanf与getchar的用法和常见错误详解

    写这篇博客的起因是最近博主自己学习中总是遇到类似的错误,并曾百思不得其解。 今天分享出来是希望帮助大家在写代码时避免这些错误。话不多说,我们直接开始吧! 君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 我们先来看看再MSDN里对scanf的解释 - scanf 的功能

    2024年02月05日
    浏览(41)
  • C语言—printf和scanf详解(万字笔记更新中....)

    在写c语言时,printf和scanf是我们必不可少且常用的,相信大多数人对它们俩的认识只是停留在表面上,并没有深入了解过它们吧,那么这一篇文就来深入对它们俩来说道说道 Printf:输出函数,将参数输出到屏幕上 案例: printf( \\\"hello nworldn\\\" ) :将hello word打印到屏幕上

    2024年03月23日
    浏览(32)
  • gets和puts函数

    1.gets类似于scanf函数,用于读取标准输入。scanf函数在读取字符串时遇到空格就认为读取结束,所以当输入的字符串存在空格时,需要使用gets函数进行读取。 gets函数的格式如下: gets函数从标准输入中获取到字符并将其加载到str中,知道遇到换行符。当输入“how are you”,可

    2024年02月03日
    浏览(28)
  • VS中出现的printf,scanf等函数不安全而报错的问题的全面解决方法

    在我们对VS的刚开始使用时,经常会遇见函数不安全而报错的问题,如  有如下三种解决办法(个人推荐第三种): 1.文件包含 #define _CRT_SECURE_NO_WARNINGS 这里又分为两种情况: (1)在 .c 文件中 有些项目比较简单,可能一个.c文件就能完成代码,这个时候把#define _CRT_SECU

    2024年02月07日
    浏览(34)
  • 【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数

    gets函数类似于scanf函数,用于读取标准输入.前面我们已经知道scanf函数在读取字符串时遇到空格就认为读取结束,所以当输入的字符串存在空格时,我们需要使用gets 函数进行读取. gets函数的格式如下: gets函数从STDIN (标准输入)读取字符并把它们加载到str(字符串)中,直到遇

    2024年01月22日
    浏览(39)
  • 【printf函数的具体用法】

    1、基本输出语句 printf()函数是C语言的输出函数,功能是按指定的输出格式把相应的参数值在标准的输出设备中显示出来。 printf(格式控制串,参数1,参数2,…),可能这样写出的格式不好理解,现在细分一下类型,其中可分为四种格式: 1、字符串型 printf(“字符串n”) 以上

    2024年02月16日
    浏览(30)
  • Flutter笔记:GetX模块中不使用 Get.put 怎么办

    Flutter笔记 GetX模块中不使用 Get.put 怎么办 作者 : 李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 : 291148484@163.com 本文地址 :https://blog.csdn.net/qq_28550263/article/details/134006728 依赖注入(Dependency Injection,DI)是一种编程模式,它旨在管理和注入类之间的依赖关系,以提高代码

    2024年02月08日
    浏览(34)
  • 【C语言初阶篇】scanf和getchar中缓存区的概念!

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,相信大家都多多少少了用过scanf和getchar()语句吧,但是关于缓存区的概念,我相信大多数人都没有听说过吧。    ⛳️ 写

    2024年02月14日
    浏览(36)
  • 【Java学习笔记】16.Java 格式化输出 printf 用法

    Java 格式化输出 printf 用法 Java 中的 printf 方法用于格式化输出。 格式化指定了输出的形式,包括数字的精度、字符宽度、日期格式等等。下面是一些常用的格式化符号和用法: 字符串格式化 %s : 输出字符串 实例 整数格式化 %d : 输出十进制整数 %o : 输出八进制整数 %x : 输出十

    2024年02月07日
    浏览(32)
  • C语言第四弹---printf和scanf详解

    ✨ 个人主页: 熬夜学编程的小林 💗 系列专栏: 【C语言详解】 【数据结构详解】 printf函数为库函数,给uu们两个查看库函数的方式,第一个下载msdn软件进行查找相关库函数知识,第二个用cplusplus网站查询库函数(建议使用旧版的,旧版的有搜索功能)。 cplusplus网站链接 旧版

    2024年01月21日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包