C语言----输入scanf和输出printf详解

news2024/12/22 23:16:58

        C语言编程中,输入输出是基本操作,printf和scanf并不是C语言中的唯一的输入输出选择,对于输入有scanf()、getchar()、getche()、getch()、gets();对于输出有printf()、puts()、putchar(),他们各有自己的使用场景,本篇文章主要介绍常用的scanf和printf

一:scanf详解

scanf 是 scan format 的缩写,意思是格式化扫描,也就是从键盘获得用户输入

1,格式化输入

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    //输入一个整数
    int a;
    scanf("%d",&a);
    printf("a = %d\n",a);
    getchar();

    //输入一个字符
    char b;
    scanf("%c",&b);
    printf("b = %c\n",b);
    getchar();

    //输入一个字符串
    char c[10] = {0};
    scanf("%s",c);
    printf("c = %s\n",c);
}

运行结果:

 上面的举例是scanf的基本用法,看到上面的例子有同学就有疑问了为什么两次输入之间要有getchar(),这个后面会讲到。对于scanf输入有严格的格式控制符,如下

格式控制符说明
%c读取一个单一的字符
%hd、%d、%ld读取一个十进制整数,并分别赋值给 short、int、long 类型
%ho、%o、%lo读取一个八进制整数(可带前缀也可不带),并分别赋值给 short、int、long 类型
%hx、%x、%lx读取一个十六进制整数(可带前缀也可不带),并分别赋值给 short、int、long 类型
%hu、%u、%lu读取一个无符号整数,并分别赋值给 unsigned short、unsigned int、unsigned long 类型
%f、%lf读取一个十进制形式的小数,并分别赋值给 float、double 类型
%e、%le读取一个指数形式的小数,并分别赋值给 float、double 类型
%g、%lg既可以读取一个十进制形式的小数,也可以读取一个指数形式的小数,并分别赋值给 float、double 类型
%s读取一个字符串(以空白符为结束)

2,带空格输入到多个变量

#include <stdio.h>
#include <stdlib.h>

int main()
{
    //输入一个整数
    int a, b, c;
    scanf("%d %d", &a, &b);
    printf("a=%d, b=%d\n", a,b);
    scanf("%d   %d", &a, &b);
    printf("a=%d, b=%d\n", a,b);
    scanf("%d, %d, %d", &a, &b, &c);
    printf("a=%d, b=%d, c=%d\n", a,b,c);
   
    scanf("%d not equal %d", &a, &b);
    printf("a=%d, b=%d\n", a,b);
    
}

运行结果:

         第一个 scanf() 的格式控制字符串为"%d %d",中间有一个空格,而我们却输入了1       2,中间有多个空格。第二个 scanf() 的格式控制字符串为"%d   %d",中间有多个空格,而我们却输入了1 2,中间只有一个空格。这说明 scanf() 对输入数据之间的空格的处理比较宽松,并不要求空格数严格对应,多几个少几个无所谓,只要有空格就行。

        用户每次按下回车键,程序就会认为完成了一次输入操作,scanf() 开始读取用户输入的内容,并根据格式控制字符串从中提取有效数据,只要用户输入的内容和格式控制字符串匹配,就能够正确提取。

         本质上讲,用户输入的内容都是字符串,scanf() 完成的是从字符串中提取有效数据的过程

3,连续输入到数组

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[5];
    int i = 0;
    for(i=0; i<5; i++)
    {
        scanf("%d",a+i);
    }
    for(i=0; i<5; i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
}

运行结果:

 4,带空格的字符串输入

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char str[100];
    scanf("%[^\n]",str);//以换行符作为字符串输入的结束
    printf("%s\n",str);
}

运行结果:

 利用格式符"%[^]",可以输入带空格的字符串到数组。需要注意的是方括号里边的^后面的字符表示的是输入的结束符,如同默认情况下空格和回车键以及TAB键是作为字符串输入的结束符一样,利用此格式符便相当于由编程者自己指定一个输入结束符。

5,刷题常用的对同一变量连续输入

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a;
    while(scanf("%d",&a)!=EOF)
    {
        printf("a = %d\n",a);
    }
}

         EOF在scanf连用时代表-1的意思,当用到while(scanf()!=EOF),代表的意思是一直输入,直到scanf返回的值是-1时才会停止输入,也可以在while里面加上一些约束条件,使输入在特定的条件下就会停止,也可以在输入完成后按下Ctrl+z,可以强行停止输入

6,scanf输入的本质

        从本质上讲,我们从键盘输入的数据并没有直接交给 scanf(),而是放入了缓冲区中,直到我们按下回车键,scanf() 才到缓冲区中读取数据。如果缓冲区中的数据符合 scanf() 的要求,那么就读取结束;如果不符合要求,那么就继续等待用户输入,或者干脆读取失败。

        需要注意的是如果缓冲区中的数据不符合 scanf() 的要求,要么继续等待用户输入,要么就干脆读取失败。

        问题回到了1章节,为什么要在每个输入后面加个getchar(),如果不加运行结果如下:

         出现这种现象就是和缓冲区有关,当我们按下enter键的时候,缓冲区里是有enter的控制符,会当做第二次scanf的输入,所以需要用getchar去清除缓冲区里的enter控制符。

二:printf详解

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

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

相关文章

C语言案例 阶乘求和-12

题目&#xff1a;求1 2&#xff01;3&#xff01; … 20&#xff01;的和。 程序分析 阶乘相关原理&#xff1a;一个正整数的阶乘是所有小于及等于该数的正整数的积&#xff0c;并且0的阶乘为1。自然数n的阶乘写作n!&#xff0c;任何大于1的自然数n阶乘表示方法&#xff1a;…

StarRocks入门部署

目录 一、StarRocks整体介绍 1.1、系统架构图&#xff1a; 1.2、FE相关 1.3、BE相关 1.4、数据管理特性 二、简单部署 2.1、部署前准备 2.2、手动部署 2.2.1、部署Leader FE节点 2.2.2、部署BE节点 2.2.3、关联FE、BE&#xff0c;搭建StarRocks集群 2.2.4、给root设…

【深度学习】日常笔记16

可以将pd.DataFrame数据结构理解为类似于Excel中的表格。pd.DataFrame是pandas库提供的一个二维数据结构&#xff0c;用于存储和操作具有行和列的数据。它类似于Excel中的工作表&#xff0c;其中每一列可以是不同的数据类型&#xff08;例如整数、浮点数、字符串等&#xff09;…

接口防护电路

一、接口电路是电路中与用户或者外界媒介进行交互的部分&#xff0c;是内部核心敏感电路和外部设备进行信息交互的桥梁。接口电路一般分为输入接口电路和输出接口电路两种。接口电路的防护设计就是为了隔离外部危险的信号&#xff0c;防止外部干扰信息进入系统内部核心敏感电路…

Linux系统USB转串口芯片 GPIO使用教程

一、简介 WCH的多款USB转单路/多路异步串口芯片&#xff0c;除串口接口以外&#xff0c;还提供独立的GPIO接口&#xff0c;各GPIO引脚支持独立的输出输入&#xff0c;GPIO功能的使用需要与计算机端厂商驱动程序和应用软件配合使用。各芯片的默认GPIO引脚状态有所区别&#xff…

Redis——常见数据结构与单线程模型

Redis中的数据结构 Redis中所有的数据都是基于key&#xff0c;value实现的&#xff0c;这里的数据结构指的是value有不同的类型。 当前版本Redis支持10种数据类型&#xff0c;下面介绍常用的五种数据类型 底层编码 Redis在实现上述数据结构时&#xff0c;会在源码有特定的…

RCNA——单臂路由

一&#xff0c;实验背景 之前的VLAN实现的很多都是相同部门互相访问&#xff0c;不同部门无法访问。不过这次整来了一个路由器&#xff0c;领导说大部分的部门虽说有保密信息需要互相隔离&#xff0c;但是这些部门和其它部门也应该互相连通以方便工作交流。因此要配置新的环境&…

2023-08-11 LeetCode每日一题(矩阵对角线元素的和)

2023-08-11每日一题 一、题目编号 1572. 矩阵对角线元素的和二、题目链接 点击跳转到题目位置 三、题目描述 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&#xff1…

linux安装ftp

一、安装 参考博客 https://blog.csdn.net/dafeigecsdn/article/details/126518069 rpm -qa |grep vsftpd # 查看是否安装ftp yum -y install vsftpd # 安装vsftpuseradd -d /home/lanren312 lanren312 # 指定在/home目录下创建用户 passwd lanren312 # 给用户设置密码 # 输…

2022年03月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;双精度浮点数的输入输出 输入一个双精度浮点数&#xff0c;保留8位小数&#xff0c;输出这个浮点数。 时间限制&#xff1a;1000 内存限制&#xff1a;65536 输入 只有一行&#xff0c;一个双精度浮点数。 输出 一行&#xff0c;保留8位小数的浮点数。 样例输…

【Unity每日一记】让一个物体按余弦曲线移动—(三角函数的简单运用)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

麻省理工学院利用水泥和炭黑制造出超级电容器

麻省理工学院的研究人员展示了一种使用低成本水泥和炭黑的制造的超级电容器&#xff0c;这一发明可能会彻底颠覆可再生能源的存储。 ​为了解决太阳能、风能和潮汐能等间歇性和非周期性电源的普及问题&#xff0c;实用并且廉价的电力储存技术一直是重要的环节。MIT的研究人员最…

从docker启动kali

前言: 偶然间在docker中发现有Linux的镜像&#xff0c;有了尝试的想法&#xff0c;于是有了本文 选了星星最多的那个&#xff0c;直接pull&#xff0c;或者命令行执行 docker run kalilinux/kali-rolling 介绍中说&#xff0c;没有任何工具&#xff0c;所以需要自己安装。 直接…

Jpa与Druid线程池及Spring Boot整合(二): spring-boot-starter-data-jpa 踏坑异常处理方案

Jpa与Druid线程池及Spring Boot整合(一) Jpa与Druid线程池及Spring Boot整合(二)&#xff1a;几个坑 附录官网文档&#xff1a;core.domain-events域事件 从聚合根发布事件 存储库管理的实体是聚合根。在领域驱动设计应用程序中&#xff0c;这些聚合根通常会发布领域事件。Sp…

Golang函数以及函数和方法的区别

在接触到go之前&#xff0c;我认为函数和方法只是同一个东西的两个名字而已&#xff08;在我熟悉的c/c&#xff0c;python&#xff0c;java中没有明显的区别&#xff09;&#xff0c;但是在golang中者完全是两个不同的东西。官方的解释是&#xff0c;方法是包含了接收者的函数。…

直播预告|EasyV全新倾斜摄影组件上线!提升大规模、高精度实景建模效率

倾斜摄影&#xff0c;也被称为斜摄影或倾斜摄影测量&#xff0c;是一种高精度、高分辨率的遥感技术&#xff0c;用于获取地表地貌、建筑物、自然环境等目标的三维信息。在城市级数字孪生可视化建设过程中&#xff0c;通常会使用倾斜摄影技术以增强地理信息分析和虚拟建模的能力…

【瑞吉外卖】Linux学习

Linux常用命令 Linux命令初体验 Linux的命令都是由一个或几个单词的缩写构成的 命令对应英文作用lslist查看当前目录下的内容pwdprint work directory查看当前所在目录cd [目录名]change directory切换目录touch [文件名]touch如果文件不存在&#xff0c;新建文件mkdir [目录…

数据结构:堆的实现(C实现)

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》 文章目录 一、堆二、实现思路1. 结构的定义2. 堆的构建 (HeapInit)3. 堆的销毁 (HeapDestroy)4. 堆的插入 (HeapPush)5. 堆的删除 (HeapPop)6. 取堆顶的数据 (HeapTop)7. 堆的数据个数 (HeapSize…

C#小轮子:Visual Studio自动编译Sass文件

文章目录 前言插件安装插件使用compilerconfig.jsonsass输入和css输出&#xff08;自动生成&#xff09;默认配置&#xff08;我不懂就不去动他了&#xff09; 前言 我们知道css文件用起来太麻烦&#xff0c;如果样式一多&#xff0c;嵌套起来用css样式就眼花缭乱。Sass使用层…

量化交易可视化(10)-等高线图

等高线图的含义 等高线图&#xff08;Contour plot&#xff09;是一种二维图形展示方式&#xff0c;用于表示函数在二维平面上的等高线。等高线图的每条等高线代表函数在该高度上的取值相同的点的集合。 等高线图的绘制方法 在matplotlib中&#xff0c;可以使用contour()函数…