C 输入 & 输出

2023-10-30

C 语言把所有的设备都当作文件。所以设备(比如显示器)被处理的方式与文件相同。以下三个文件会在程序执行时自动打开,以便访问键盘和屏幕。
表1 标准文件

标准文件 文件指针
标准输入 stdin
标准输出 stdout
标准错误 stderr

表2 stdio.h中的基本输入输出函数

input functions output functions
getchar() putchar()
gets() puts()
scanf() printf()

getchar()函数

getchar()函数的作用是从标准的输入stdin中读取字符。也就是说,getchar()函数以字符为单位对输入的数据进行读取。简而言之getchar()函数一次读取一个字符,并将其存储在一个变量中。如:

ch = getchar();//从键盘输入获取一个字符,并将其存储在ch中

在控制台中通过键盘输入数据时,以回车键作为结束标志。当输入结束后,键盘输入的数据连同回车键一起被输入到输入缓冲区中。在程序中第一次调用getchar()函数从输入缓冲区中读取一个字节的数据。需要注意的是,如果此时在程序中第二次调用getchar()函数,因为此时输入缓冲区中还有回车键的数据没有被读出,第二个getchar()函数读出的是回车符。可以使用rewind()函数来清理输入缓冲区中的数据。如:

ch = getchar();//得到输入的字符
rewind(stdin);//清除键盘输入缓存中的内容,即清除回车

putchar()函数

putchar函数的基本格式为:putchar(int c);
当c为一个被单引号(英文状态下)引起来的字符时,输出该字符(注:该字符也可为转义字符);
当c为一个介于0~127(包括0及127)之间的十进制整型数时,它会被视为对应字符的ASCII代码,输出该ASCII代码对应的字符;
当c为一个事先用char定义好的字符型变量时,输出该变量所指向的字符。
当整型变量c超出8位变量的范围时,c则会变强制转化为8位变量(即取其低八位传过去输出),当为负数的时候,由于计算机存储负数是用补码表示的,所以传过去的二进制补码也被当做正数处理,也是取其低八位。

gets()函数

在c语言中读取字符串有多种方法,比如scanf() 配合%s使用,但是这种方法只能获取一个单词,即遇到空格等空字符就会返回。如果要读取一行字符串,比如:I love you!,这种情况,scanf()就无能为力了。这时我们最先想到的是用gets()读取.
gets()函数从标准输入(键盘)读入一行数据,所谓读取一行,就是遇到换行符就返回。gets()函数并不读取换行符’\n’,它会把换行符替换成空字符’\0’,作为c语言字符串结束的标志。
gets()函数存在一个严重的缺陷,这个缺陷就是:它不会检查数组是否能够装得下输入行。
如果输入的字符串过长,会导致缓冲区溢出(buffer overflow),即多余的字符超出了指定的目标空间。gets()函数就会访问未被分配的内存空间,如果这些内存未被使用,不会立即出现问题;如果这片空间已经存有数据,就会擦除掉程序中的其他数据,会导致程序中止。
我们可以用fgets()函数来代替gets(),如果不希望程序中止或退出当输入太长,超过数组容纳的字符时,fgets()最容易使用,而且可以选择不同的处理方式。

puts()函数

函数原型:int puts(const char *string);
功能:向控制台输出一串字符串,即送一字符串到stdout中
参数:输入:字符串指针,输入可以是字符串数组,也可以是字符串常量
gets()函数经常和puts()函数配对使用,puts()函数用于显示字符串,并自动在字符串后面添加一个换行标志’\n’

scanf()函数

scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。
其调用格式为: scanf("<格式化字符串>",<地址表>);
需要多个输入时,在两个数据之间可以用一个或多个空格、tab键、回车键分隔。
使用地址运算符&加变量名来将读取到的信息保存到相应的地址,若是字符串变量,则无需&,因为字符串变量的变量名即为地址(同数组名)。
scanf()函数返回成功赋值的数据项数,出错时则返回EOF。
其控制串由三类字符构成:格式化说明符;空白符;非空白符;
表3 格式化说明符

格式串 含义
%c 读入一个字符
%s 读入一个字符串
%i 读入一个整数
%d 读入一个十进制整数
%f 读入一个单精度浮点
%lf 读入一个双精度浮点
%o 读入一个八进制整数
%x或%X 读入一个十六进制整数
%e或%E 读入一个科学计数法数值,如1.2e5
%p 读入一个指针
%% 读入一个%符号

空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符,空白符可以是space,tab,newline等等,直到第一个非空白符出现为止。一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。
scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。

  1. 遇空格、“回车”、“跳格”键
  2. 遇宽度结束
  3. 遇非法输入

这就造成了scanf()函数不能正确接受有空格的字符串,如: I love you!,可以使用fgets()代替。
更安全的scanf_s()函数:
scanf_s() 的功能虽然与scanf() 相同,但却比 scanf() 安全,因为 scanf_s() 是针对“ scanf()在读取字符串时不检查边界,可能会造成内存泄露”这个问题设计的。
scanf_s()用于读取字符串时,必须提供一个数字以表明最多读取多少位字符,以防止溢出。

printf()函数

printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。
printf()函数的调用格式为: printf("<格式化字符串>", <参量表>);
其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以"%“开始, 后跟一个或几个规定字符, 用来确定输出内容格式。
参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用”,"分开, 且顺序一一对应, 否则将会出现意想不到的错误。
注意:函数printf从左往右读取,然后将先读取放到栈底,最后读取的放在栈顶,处理时候是从栈顶开始的,所有我们看见的结果是,从右边开始处理的。
表4 格式化规定符

符号 作用
%d 十进制整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 单个字符
%p 指针的值
%e 指数形式的浮点数
%x或%X 无符号十六进制整数
%g 自动选择合适的表示法

可以在"%"和字母之间插进数字或变量表示最大场宽
  例如: %3d 表示输出3位整型数, 不够3位右对齐。
  %9.2f 表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6, 小数点占一位, 不够9位右对齐。
  %8s 表示输出8个字符的字符串, 不够8个字符右对齐。
如果字符串的长度、或整型数位数超过说明的场宽, 将按其实际长度输出。但对浮点数, 若整数部分位数超过了说明的整数位宽度, 将按实际整数位输出。若小数部分位数超过了说明的小数位宽度, 则按说明的宽度以四舍五入输出。
另外, 若想在输出值前加一些0, 就应在场宽项前加个0。
  例如: %04d 表示在输出一个小于4位的数值时, 将在前面补0使其总宽度为4位。
如果用浮点数表示字符或整型量的输出格式, 小数点后的数字代表最大宽度, 小数点前的数字代表最小宽度。
  例如: %6.9s 表示显示一个长度不小于6且不大于9的字符串。若大于9, 则第9个字符以后的内容将被删除。
可以在"%"和字母之间加小写字母l, 表示输出的是长型数
  例如: %ld 表示输出long整数 ;%lf 表示输出double浮点数
可以控制输出左对齐或右对齐, 即在"%“和字母之间加入一个”-" 号可说明输出为左对齐, 否则为右对齐。
  例如: %-7d 表示输出7位整数左对齐 ;%-10s 表示输出10个字符左对齐 ;%-m.nf表示输出数据共占m列,n位小数,如果数据长度小于m那么左靠齐,右补空格.
表5 一些特殊规定字符

字符 作用
\n 换行
\f 清屏并换页
\r 回车
\t Tab符
\xhh 一个ASCII码用16进制表示,hh表示1到2个16进制数

另:反斜杠、单引号、双引号的输出在之前多加一个反斜杠即可。

参考文献

https://blog.csdn.net/hou09tian/article/details/80741890
http://www.runoob.com/cprogramming/c-input-output.html
https://blog.csdn.net/libing403/article/details/73076925?utm_source=blogxgwz0
https://blog.csdn.net/libing403/article/details/73010866
https://blog.csdn.net/hk_kang/article/details/78747726
https://blog.csdn.net/silleyj/article/details/8545408
https://blog.csdn.net/jiangkaiyao001/article/details/9243255

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 输入 & 输出 的相关文章

  • printf 命令导致段错误? [复制]

    这个问题在这里已经有答案了 当我尝试初始化一个大型的二维字符数组时 它工作得很好 但是当我添加一个简单的打印命令时 它给了我一个分段错误 关于为什么会发生这种情况有什么想法吗 include
  • JavaScript 相当于 printf/String.Format

    我正在寻找一个与 C PHP 相当的 JavaScriptprintf 或者对于 C Java 程序员来说 String Format IFormatProvider对于 NET 我的基本要求是目前数字的千位分隔符格式 但处理大量组合 包括
  • 为什么 scanf() 需要“%lf”来表示双精度数,而 printf() 只需使用“%f”就可以了?

    为什么会这样scanf 需要l in lf 当读一个double when printf 可以使用 f 无论它的参数是否是double or a float 示例代码 double d scanf lf d printf f d 因为对于采
  • 在 MATLAB 中使用 sprintf 显示变量的小数

    我不明白接下来会发生什么sprintf http www mathworks se help techdoc ref sprintf html命令 gt gt vpa exp 1 53 ans 2 718281828459045534884
  • 从 Visual Studio 的哪个版本开始 vsnprintf 基本上符合标准?

    根据微软的文档vsnprintf https msdn microsoft com en us library 1kt27hek aspx 至少从 2003 版 Visual Studio 开始 该函数就是 C 运行时库的一部分 int v
  • 格式化整数时 printf 中的精度字段

    当我执行这两行时 printf 5d n 3 use of precision filed printf 05d n 3 use of 0 flag to prepend with 0 我得到以下输出 00003 00003 结果相同 所以
  • 使用 sprintf 打印元素数量可变的向量

    在下面的代码中 我可以打印向量中的所有元素item用空格分隔为 item 123 456 789 sprintf d d d item ans 123 456 789 我怎样才能做到这一点而不必输入那么多 d作为元素的数量item 最简单的
  • 使用 scanf 读取行或在特殊字符上中断

    是否可以使用 scanf 读取文本行 排除 n并在特殊 选择的 字符上中断 但包括该字符 这是我现在的表情 while scanf 49 n c x 1 但这不包括 是否可以中断阅读 但也读那个字符 好的 我正在使用约翰内斯 绍布 利特 c
  • C 编程:正向变量参数列表

    我正在尝试编写一个函数 它接受可变数量的参数 如 printf 执行一些操作 然后将变量列表传递给 printf 我不知道如何做到这一点 因为它似乎必须将它们推入堆栈 大约是这样的 http pastie org 694844 http p
  • 字符串格式化表达式 (Python)

    字符串格式化表达式 This is d s example 1 nice 字符串格式化方法调用 This is 0 1 example format 1 nice 我个人更喜欢方法调用 第二个示例 以提高可读性 但由于它是新的 因此随着时间
  • 将 scanf 与 NSString 一起使用

    我希望用户输入一个字符串 然后将输入分配给 NSString 现在我的代码如下所示 NSString word scanf s word The scanf http www cplusplus com reference clibrary
  • C++ 的 String.Format

    正在寻找 NET 的 String Format 等函数的 C 实现 显然有 printf 及其变体 但我正在寻找具有位置的东西 如下所示 String Format 您好 0 您是 1 岁 感觉如何 1 姓名 年龄 这是必要的 因为我们将
  • 如何正确安全地使用sscanf

    首先 关于使用的其他问题sscanf不要回答我的问题 因为常见的答案是不使用sscanf完全并使用fgets or getch相反 这对我来说是不可能的 问题是我的 C 教授希望我使用scanf在一个程序中 这是一个要求 然而 程序还必须处
  • 需要在python中找到print或printf的源代码[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在做一些我不能完全谈论的事情 我
  • 有没有办法限制C中的scanf?

    我正在尝试编写一个正确的控制台应用程序以供链接列表使用 因此我需要在无限循环中扫描多个命令 并根据 switch case 选项执行某些操作 所以我为此使用 scanf 但问题是当下一行不包含数字时它会循环并开始打印甚至不是默认值 whil
  • awk 每个文件后换行

    使用此脚本 每个字段都会根据当前文件的最长单词打印出来 但需要每个文件都有一个换行符 如何才能实现这一目标 awk BEGIN ORS n FNR NR a i 0 if length 0 gt length max max 0 l len
  • en_CA 语言环境中 sprintf 中的逗号作为小数分隔符

    是否可以在 en CA 语言环境中的 sprintf 中使用逗号作为小数点分隔符 sprintf 能够识别区域设置 并且将始终使用当前的区域设置 但您可以使用数字格式 http php net manual en function numb
  • PHP fscanf 与 fgets

    我可以使用读取一行中的整个字符串fgets but fscanf 没有这样做 根据PHP手册 fscanf 根据格式解析文件的输入 功能fscanf 类似于sscanf 但它从与句柄关联的文件中获取输入 并根据指定的格式解释输入 这在文档中
  • fscanf 和 EOF 中的否定扫描集

    我的文件中有一个以逗号分隔的字符串列表 姓名 1 姓名 2 姓名 3 我想跳过所有逗号来阅读这些名字 我写了以下循环 while true if fscanf file my string 1 break 然而 它总是比预期多执行一次 给定
  • Clang 5.0 上的 vsprintf 和 vsnprintf [-Wformat-nonliteral] 警告

    我有这段代码 static void err doit int errnoflag int level const char fmt va list ap int errno save unsigned long n char buf MA

随机推荐

  • Scanner注意事项与报错(next()、nextInt()、nextline()等)

    首先介绍一个经典的问题 nextline和nextInt混用出现的问题 当前面有nextInt时 nextLine不会等待你输入字符串 如下 如图 控制台还没有等我输入字符串就直接输出了num 因为你输入10的时候实际是按了回车 因此输入的
  • Hive常用函数介绍(窗口函数)

    1 窗口函数介绍 窗口函数 也叫也叫OLAP函数 Online Anallytical Processing 联机分析处理 可对数据库数据进行实时分析处理 2 窗口函数入门 2 1 函数说明 窗口函数 也可以叫做开窗函数 其从本质来看是将
  • Parasoft SOAtes发布最新v9.10.7版本,采用全新的测试数据管理方法!

    Parasoft SOAtest是业内最全面的测试解决方案 有着和loadrunner同样强大的性能测试 压力测试 负载测试功能 很高兴的告诉大家 Parasoft SOAtest更新至v9 10 7版本 新增多种功能并实现全面的API测试
  • IMU数据手套控制无人机飞行

    在未知和复杂的飞行环境中 无人机飞行动作的规划 需要手势辅助人机 针对这一问题 军事科学院国防技术国家创新研究所联合天津人工智能创新中心和华东理工大学团队研发了一款可以捕捉指尖运动和手势的IMU数据手套 用以实现人与无人机的交互和辅助控制
  • ipa-apk.cn/dbl.html,ComicBook/package-lock.json at master · liyuechun/ComicBook · GitHub

    name comicbook version 0 0 1 lockfileVersion 1 dependencies abab version 1 0 3 resolved https registry npmjs org abab ab
  • C++基础08---this,static

    1 this 1 在我们利用某个类对象调用成员函数时 编译器将这个对象的地址传递给该成员函数中的一个隐藏的this形参 2 任何对类成员变量的直接访问都被看作是通过this做隐式调用 3 this指针只能在成员函数中使用 全局函数 静态函数
  • 程序员版孔乙己

    互联网的格局 是和别处不同的 都是格子衫 稀疏的头发 双肩包 男 写代码的人 傍午傍晚散了工 每每三两人 背着手 沿着软件园溜达一圈 倘肯花点钱 便还会走到星巴克 买一杯咖啡 那样便能再多摸几分钟的鱼 我从十九岁起 便在软件园的星巴克打工
  • 代码随想录一刷-Day08

    Offer58 II 左旋转字符串 使用中间数组很容易 public String reverseLeftWords String s int n if n 0 s null s length 0 return s 使用中间数组 char
  • vRealize Operations Manager 安装部署

    前话 关于VROPS好不好用的问题 我只想说 谁用谁知道 早用早HAPPY 官方描述有 VMware vRealize Operations是一个高度可扩展 可扩展且直观的操作平台 可集中管理软件定义数据中心 SDDC 它可根据业务或运营意
  • 【PCIe】5: PCIe DBI (Date Bus Interface)

    目录 1 DBI 2 CDM 3 ELBI 3 1 EP 的排布 3 2 RC对应空间排布 1 DBI DBI Data Bus Interface You can use this interface to locally access
  • 如何保证消息队列的顺序性?

    面试题 如何保证消息的顺序性 面试官心理分析 其实这个也是用 MQ 的时候必问的话题 第一看看你了不了解顺序这个事儿 第二看看你有没有办法保证消息是有顺序的 这是生产系统中常见的问题 面试题剖析 我举个例子 我们以前做过一个 mysql b
  • 二十七、python学习之前端(十):Vue入门

    一 vue简介 1 vue简介 Vue js是前端三大新框架 Angular js React js Vue js之一 Vue js目前的使用和关注程度在三大框架中稍微胜出 并且它的热度还在递增 Vue js可以作为一个js库来使用 也可以
  • 安装QT5.4.0

    安装 Qt 第一步 到官网https download qt io new archive qt 5 4 5 4 0 qt opensource linux x64 5 4 0 run下载 Qt 安装包 此处本人安装的是 qt openso
  • Java算法——地图单点坐标判断是否存在于某个区域

    Java算法 地图单点坐标判断是否存在于某个区域 在气象项目中 需要我们通过网格数据 来识别分析天气 之后判断该天气在具体什么省市县 而提醒该地方将要发生什么天气 而每个省市县都有自己得经纬度范围 而且不规则性 我们如何将从网格上面识别得天
  • 初识uni-app

    初识uni app 跨平台开发的神器 本文将为大家介绍uni app 一款强大的跨平台App开发框架 我们将探讨其特点 优势以及如何快速上手开发一个简单的uni app应用 1 什么是uni app uni app是由DCloud公司研发的
  • DSP相关笔记_1:LaunchXL-F28379D的简单教程系列(一)GPIO输出

    LaunchXL F28379D的简单教程系列 一 GPIO输出 本文分为函数库和寄存器两种方法 注 这是本人关于Ti的C2000系列的学习笔记 所用工具有官方的开发软件CCS10版本 帮助文库以及函数库软件controlSUITE 硬件部
  • QGLViewer编译过程

    libQGLViewer 2 7 1 官网下载 http libqglviewer com installWindows html Qt5 11 0 编译器 MSVC2017 64bit 解压后的样子 1 编译QGLViewer 打开QGL
  • python列表输出去掉引号,如何从列表输出中删除逗号和引号

    很难把这些引号和逗号从我的列表中去掉 SHOWN BELOW IN THE SECOND PART OF MY CODE OUTPUT 我需要从输出中剥离所有 我一直在我的team variable上尝试rstrip 但它给了我这个错误 在
  • jQuery.validate.js API

    jQuery validate js API Name Type validate options Returns Validator 验证所选的FORM valid Returns Boolean 检查是否验证通过 rules Retur
  • C 输入 & 输出

    C 语言把所有的设备都当作文件 所以设备 比如显示器 被处理的方式与文件相同 以下三个文件会在程序执行时自动打开 以便访问键盘和屏幕 表1 标准文件 标准文件 文件指针 标准输入 stdin 标准输出 stdout 标准错误 stderr