三:C语言-输入与输出

三:输入与输出

一:输出

1.printf()

​ 将参数文本输出到屏幕上,它名字里的 f 代表 format(格式化),表示可以定制输出文本的格式

printf()不会在行尾自动添加换行符,待运行结束后,光标就停留在输出结束的地方,不会自动换行,而为了让光标移到下一行的开头,需在输出文本的结尾,添加一个换行符 \n

#include <stdio.h>
int main()
{printf("你好\n");return 0;
}

注意: 因为printf()是在标准库的头文件stdio.h中定义的,所以,在使用这个函数之前,必须在源码文件头部引入这个头文件#include <stdio.h>

​ 想在哪里换行就在哪里添加换行符,在文本行内部也可以添加换行符

#include <stdio.h>
int main()
{printf("你好呀\n乔");return 0;
}
2.占位符:

​ 占位符表示这个位置会被后面的值给替换掉

#include <stdio.h>
int main()
{printf("你好呀%d岁的乔\n",18); //在输出的时候,%d所占的位置被后面的18给替换掉了return 0;
}

注意: 占位符的第一个字符一律为 %,第二个字符表示占位符的类型

printf()的第二个参数就是替换掉占位符的值

#include <stdio.h>
int main()
{printf("我想去%s\n","北京"); //%s表示的是占位的是字符串类型return 0;
}

注意: 因为%s表示代入的是字符串,所以printf()的第二个参数就必须是字符串

输出文本中也可以使用多个占位符

#include <stdio.h>
int main()
{printf("你好呀%d岁的乔,我想去%s\n",18,"北京");return 0;
}

注意: 占位符和后面的值必须是一一对应的关系,不可以调换位置,占位符的个数与后面值的个数也必须是一致的

占位符的种类:

占位符描述
%a十六进制浮点数,字母输出为小写
%A十六进制浮点数,字母输出为大写
%c字符输出
%d打印十进制整数
%e使用科学计数法的浮点数,指数部分的e为小写
%E使用科学计数法的浮点数,指数部分的E为大写
%i整型输出,基本等同于%d
%f打印float类型的浮点数
%lf打印double类型的浮点数
%g6个有效数字的浮点数,整数部分一旦超过6位,就会自动转为科学计数法,指数部分的e为小写
%G等同于%g,唯一的区别是指数部分的E为大写
%hd十进制short int类型
%ho八进制short int类型
%hx十六进制short int类型
$huunsigned short int类型
%ld十进制long int类型
%lo八进制long int类型
%lx十六进制long int类型
%luunsigned long int类型
%lld十进制long long int类型
%llo八进制long long int类型
%llx十六进制long long int类型
%lluunsigned long long int类型
%Le科学计数法表示的long double类型的浮点数
%Lflong double类型的浮点数
%n已输出的字符串数量,该占位符本身不输出,只将值存储在指定变量之中
%o八进制整数
%p用于指针
%s用于字符串
%uunsigned int
%x十六进制整数
%zdsize_t类型
%%输出一个百分号
3.输出格式:

(1)限定宽度

printf()允许限定占位符的最小宽度

#include <stdio.h>
int main()
{printf("%5d\n",185); //输出为 "  123"return 0;
}

注意: %5d表示这个占位符的宽度至少是5位,如果后面的值不满5位,那么就会自动在这个值的前面填充空格补齐位数;如果超过指定位数,则值正常输出

​ 输出的值默认是右对齐,即在输出内容的前面填充空格;如果要改成左对齐,即在输出内容的后面填充空格,可以在占位符%的后面插入一个 -

#include <stdio.h>
int main()
{printf("%-5d\n",123); //输出为 "123  "return 0;
}

​ 对于小数,限定的是所有数字的最小显示宽度

#include <stdio.h>
int main()
{printf("%12f\n",123.45); //输出为 "  123.450000"return 0;
}

注意: %12f表示输出的浮点数最少要占12位,小数点也算一位,由于小数的默认显示精度是小数点后6位,所以编译器会自动用0把后面所欠缺的位数补齐;然后在头部把整体的12位所欠缺的位数用空格填充

(2)总是显示正负号

​ 默认情况下,printf()不会对正数显示 + 号,只会对负数显示 - 号,如果要让正数也输出 + 号,可以在占位符 % 的后面加一个 +

#include <stdio.h>
int main()
{printf("%+d\n",12); //输出 +12printf("%+d\n",-12); //输出 -12return 0;
}

(3)限定小数位数

​ 想要限定小数点后面的位数,可以在 % 的后面添加 .想要限定的位数

#include <stdio.h>
int main()
{printf("%.2f\n",123.457806); //限定输出小数点后两位,输出为 123.46return 0;
}

注意: 当想要限定的位数大于小数点后面的位数时,编译器会自动用0去填充

​ 编译器会自动进行四舍五入

这种写法还可以与限定宽度占位符一起结合使用:

#include <stdio.h>
int main()
{printf("%-6.2f\n",1.5); //输出 "  1.50"return 0;
}

注意%6.2f 表示输出浮点数的最小宽度为6,小数点后的位数为2,而%后面有 - 号表示左对齐,所以,输出浮点数的尾部应补充两个空格

最小宽度和小数位数这两个限定值,都可以用 * 代替,通过printf()的参数传入:

//等同于printf("%6.2f\n",0.34)
#include <stdio.h>
int main()
{printf("%*.*f\n",6,2,0.34); // 6 和 2 传入 * 号,一一对应return 0;
}

(4)输出部分字符串

%s 占位符用来输出字符串,默认是全部输出;如果只想输出开头的部分,限定字符串的位数,可以在 % 的后面添加 .想要限定的位数

#include <stdio.h>
int main()
{printf("%.5s\n","zheshi一个字符串"); return 0;
}

二:输入

1.scanf()

​ 当我们需要给变量输入值时就可以使用scanf()函数,将键盘输入的值放在变量里;如果需要给变量的值输出在屏幕上的时候可以使用printf()函数

#include <stdio.h>
int main()
{int a = 0;printf("请输入年龄:");scanf("%d",&a); //&表示取地址,将输入的值放在a中printf("年龄是:%d\n",a);return 0;
}

注意:VS 编译器报出错误:C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

​ 提示 scanf 函数不安全需要替换成 scanf_s 时的解决办法:

方法(1)在当前程序的第一行加上:

#define _CRT_SECURE_NO_WARNINGS 1

注意: 为什么不把 scanf 替换成 scanf_s

​ 因为:scanf_s 函数是 VS 提供的,并不是C语言标准库中的函数;也就是说,这个函数在其它的编译器上运行不了,所以不能使用 scanf_s 会使代码降低可移植性

方法(2)让每一个创建的 .c 文件自动加上 #define _CRT_SECURE_NO_WARNINGS 1

在VS安装路径下的 newc++file.cpp 文件中加上 #define _CRT_SECURE_NO_WARNINGS 1

因为所有新建的 .c / .c++文件都是拷贝 newc++file.cpp 这个文件的

方法(3)让错误失效,此代码可以放在任何地方

#pragma warning(disable:4996) 
//#pragma warning指的是处理警告;disable指的是失效;4996指的是这个错误的编号

scanf() 函数用于读取用户的键盘输入,当程序运行到 scanf() 这个语句时,会停下来,等待用户从键盘输入,当用户输入数据,按下回车键后,scanf() 函数就会处理用户的输入,并将其存入变量,scanf() 定义在头文件 <stdio.h> 中,语法与 printf() 函数类似

scanf("占位符",&变量);/*
scanf()函数的第一个参数为格式化字符串,里面是占位符(与printf()的占位符基本一致),用来告诉编译器需要提取的数据是什么类型,因为在C语言中数据都是有类型的,scanf()函数必须提前知道用户输入的是什么数据类型,才能够进一步去处理数据;scanf()函数的其余参数是用来存放用户输入的变量的,格式化字符串里有多少个占位符,就有多少个变量;&变量表示,将用户从键盘输入的数据存入变量当中。
*/

注意: 因为 scanf() 函数传递的不是值,而是一个地址,即将变量的地址指向用户输入的值,所以变量的前面必须加上 & 运算符(指针变量除外)

scanf() 后面不用加换行符

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{int a = 0;float b = 0.0;unsigned c = 0;scanf("%d %f %u",&a,&b,&c);printf("%d %f %u\n",a,b,c);return 0;
}

注意: 当这样输写代码后,在控制台输入时,数据与数据之间一定要加空格或者回车,因为 scanf() 在处理数据时会自动过滤空白字符,包括空格;制表符;换行符等,所以在用户输入数据之间,有一个或多个空格并不影响 scanf() 解读数据

scanf() 的返回值是一个整数,表示成功读取到的变量的个数;当没有读取到任何项或者匹配失败时,则返回一个0;如果在成功读取任何数据之前,发生了读取错误或者遇到文件结尾,则返回常量 EOF

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{int a;float b;int s = scanf("%d %f",&a,&b);printf("a=%d b=%f\n",a,b);printf("s=%d\n",s);return 0;
}

注意: EOF 的本质是 -1

2.占位符:

scanf() 里面的占位符与 printf() 里的占位符基本一致

占位符含义
%c字符
%d整数
%ffloat 类型的浮点数
%lfdouble 类型的浮点数
%Lflong double 类型的浮点数
%s字符串
%[]在方括号中指定一组匹配的字符(比如 %[0-9]),当遇到不在集合之中的字符时,匹配将会停止

注意:

  • 上面的所有占位符,除了 %c 以外,都会自动忽略起首的空白字符;%c 不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格;如果要强制跳过字符前的空白字符,可以写成 scanf(" %c",&变量) ,即在 %c 前加上一个空格,表示跳过0个或多个空白字符
  • %s其实并不能完全的等同于字符串,它的用法是从当前第一个非空白字符开始读起,直到遇到空白字符(即空格;制表符;换行符等)便读取结束,因为 %s 不会包含空白字符,所以无法用来读取多个单词,除非多个 %s 一起使用,这也表示 scanf() 不适合读取可能包含空格的字符串,另外,当 scanf() 遇到 %s 占位符,会在字符串的变量末尾存储一个空字符 \0
  • scanf()函数不安全的地方:scanf() 将字符串读入字符数组时,不会检测字符串是否超过了数组长度,所以,当存储字符串时,很可能会超过数组的边界,导致出现溢出错误,而为了防止出现这种情况,在使用 %s 占位符时,应当指定读入字符串的最大长度,即 %所读取字符串的最大长度s,其中所读取字符串的最大长度为整数,后面没有被读取到的字符将会被舍弃
#include <stdio.h>
int main()
{char name[11]; // name为长度11的字符数组scanf("%10s",name); // %10s表示最多读取用户输入的10个字符;数组不需要取地址printf("%s\n",name)return 0;
}
3.赋值忽略符:

有时,用户的输入可能不符合预定的格式。比如:

#include <stdio.h>
int main()
{int year = 0;int month = 0;int day = 0;scanf("%d-%d-%d",&year,&month,&day);print("%d %d %d\n",year,month,day)return 0;
}

在此示例中,用户正常输入2024-01-25,则会正确解读出年;月;日。但如果用户输入的是其它格式,比如2024/01/25,在这种情况下,scanf()解析数据就会发生失败。

为了避免这种情况产生,scanf()提供了一个赋值忽略符(assignment suppression character)*,只要把赋值忽略符*加在任何占位符的%后面,该占位符就不会返回值,解析后将被舍弃。

#include <stdio.h>
int main()
{int year = 0;int month = 0;int day = 0;scanf("%d%*c%d%*c%d",&year,&month,&day);print("%d %d %d\n",year,month,day)return 0;
}

在这里,%*c就是在占位符的%后面,加入了赋值忽略符*,表示这个占位符没有对应的变量,解读后不必返回

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/646627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA(十)2022版本 Services中服务窗口不显示端口号解决

目录 一、问题描述二、问题分析三、解决方案3.1 设置启动参数【生效】3.2 方法二&#xff1a;设置环境变量【不生效】3.3 方法三&#xff1a;删除缓存【不生效】 四、补充&#xff1a;如何手动控制端口显示 一、问题描述 我们在使用 IDEA 的过程中&#xff0c;会发现在 Servic…

Hive之set参数大全-11

设置 Map Join 操作中优化哈希表的工作集大小&#xff08;working set size&#xff09; hive.mapjoin.optimized.hashtable.wbsize 是 Apache Hive 中的一个配置属性&#xff0c;用于设置 Map Join 操作中优化哈希表的工作集大小&#xff08;working set size&#xff09;。 …

Dockerfile:如何写一个Dockerfile文件?

如何写一个Dockerfile文件&#xff1f; &#x1f6a8;推荐参考&#xff1a;Dockerfile&#xff1a;如何写一个Dockerfile文件&#xff1f; 现在的项目肯定都离不开docker&#xff0c;只要是流水线部署就会涉及Dockerfile文件&#xff0c;那么如何写一个正确的编写一个Dockerfil…

dpdk网络转发环境的搭建

文章目录 前言ip命令的使用配置dpdk-basicfwd需要的网络结构测试dpdk-basicfwddpdk-basicfwd代码分析附录basicfwd在tcp转发时的失败抓包信息DPDK的相关设置 前言 上手dpdk有两难。其一为环境搭建。被绑定之后的网卡没有IP&#xff0c;我如何给它发送数据呢&#xff1f;当然&a…

[leetcode] 18. 四数之和

文章目录 题目描述解题方法排序 双指针java代码 相似题目 题目描述 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&a…

二、Kotlin 内置类型

1. 基本类型 1.1 Kotlin 和 Java 的基本类型对比 KotlinJava字节Bytebyte/Byte整型Int & Longint/Integer & long/Long浮点型Float & Doublefloat/Float & double/Double字符Charchar/Chararcter字符串StringString 1.2 定义变量 1.2.1 val 只读变量 &…

qt初入门5:字体设置和元对象系统的练习

空闲时间&#xff0c;参考课本demo&#xff0c;做一下练习。 字体的颜色主要用QPalette类&#xff0c;调色板的作用&#xff0c;控制着窗口部件的颜色和外观&#xff0c;包括背景色、前景色、文本颜色、边框颜色等。 字体的显示样式主要用Font类&#xff0c;用于管理字体。 元…

python三数之和

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例 1…

无限学模式-“重塑科研学习路径:ChatGPT应用实战课,开启高效率、高创新的科研之旅!“

ChatGPT 在论文写作与编程方面也具备强大的能力。无论是进行代码生成、错误调试还是解决编程难题&#xff0c;ChatGPT都能为您提供实用且高质量的建议和指导&#xff0c;提高编程效率和准确性。此外&#xff0c;ChatGPT是一位出色的合作伙伴&#xff0c;可以为您提供论文写作的…

【研0日记】24.01.25

回家倒数第6天 受不了了&#xff0c;不想写了&#xff0c;这群b怎么这么能写 用latex写了个伪代码&#xff0c;有点好玩 \usepackage[ruled,linesnumbered]{algorithm2e} \begin{algorithm}[ht] \caption{Pipeline of Kernel Iteration in K-Net.} \label{alg:alg1} …

2024年软考报名时间及条件,小白必看

不少考生开始准备报名2024年软件水平考试&#xff0c;那么报名软考有没有学历、专业以及工作经验等方面的限制呢?今天就给大家梳理下2024年软考考试&#xff0c;若有变更&#xff0c;也会及时更新内容。 免费送备考资料。联系我 2024年软考考试时间 2024年软考有两次考试&a…

在Java中如何优雅使用正则表达式?

在Java中如何优雅使用正则表达式&#xff1f; 一、正则表达式的基本概念与用途 1.1 正则表达式的简介 正则表达式&#xff0c;又称规则表达式。&#xff08;英语&#xff1a;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09;&#xff0c;是计算…

不通过代码绕过浏览器跨域检测(权宜之策)

通过属性找到浏览器可执行程序目录 然后在cmd该目录下输入&#xff1a; msedge.exe --args --disable-web-security --user-data-dirD:\temp上述代码是以edge浏览器为例&#xff0c;找到的可执行文件名为msedge.exe&#xff0c;最后的"D:\temp"为自己新建的一个有效…

深入理解badblocks

文章目录 一、概述二、安装2.1、源码编译安装2.2、命令行安装2.3、安装确认 三、重要参数详解3.1、查询支持的参数3.2、参数说明 四、实例4.1、全面扫描4.2、破坏性写入并修复4.3、非破坏性写入测试 五、实现原理六、注意事项 团队博客: 汽车电子社区 一、概述 badblocks命令是…

代码随想录算法训练营第十六天|104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

104.二叉树的最大深度 思路&#xff1a;这道题最开始的时候&#xff0c;我想的是用前序遍历的思路来做&#xff0c;整个过程有剪枝的过程&#xff0c;弄了半天没写出来&#xff0c;主要是剪枝没写对&#xff01;最大深度是叶子节点的高度&#xff0c;可以使用后序遍历来做。 cl…

el-table 动态渲染多级表头;一级表头根据数据动态生成,二级表头固定

一、表格需求&#xff1a; 实现一个动态表头&#xff0c;一级表头&#xff0c;根据数据动态生成&#xff0c;二级表头固定&#xff0c;每列的数据不一样&#xff0c;难点在于数据的处理。做这种表头需要两组数据&#xff0c;一组数据是实现表头的&#xff0c;另一组数据是内容…

Web网页生成桌面应用

前言&#xff1a;网页生成桌面指的是将一个网页保存为桌面应用程序的形式&#xff0c;使得用户可以在桌面上直接打开该网页&#xff0c;而不必通过浏览器打开。这种桌面应用程序一般具有独立的窗口、菜单、工具栏等界面元素&#xff0c;能够提供更加方便快捷的使用体验。 实现…

【pytorch】pytorch学习笔记(续1)

p22&#xff1a;1.加减乘除&#xff1a; &#xff08;1&#xff09;add(a,b)&#xff1a;等同于ab。 &#xff08;2&#xff09;sub(a,b)&#xff1a;等同于a-b。 &#xff08;3&#xff09;mul(a,b)&#xff1a;等同于a*b。 &#xff08;4&#xff09;div(a,b)&#xff1a…

Go 接口

接口概览 接口大概理解 接口类型是队其他类型行为的概括与抽象 接口类型中&#xff0c;包含函数声明&#xff0c;但没有数据变量接口的作用通过使用接口&#xff0c;可以写出更加灵活和通用的函数&#xff0c;这些函数不用绑定在一个特定的类型实现上Go 接口特征 很多面向对象…

验厂的类型的流程

【验厂的类型的流程】 在全球贸易一体化的进程中&#xff0c;验厂已经成为出口外贸企业真正与世界接轨的一道门槛&#xff0c;并且通过近几年的不断发展&#xff0c;验厂也逐渐为企业所熟知和充分重视。 如何正确理解验厂标准&#xff0c;实施有效的方案&#xff0c;满足验厂的…