当前位置: 首页 > news >正文

详解C/C++输入输出

前言

C/C++输入输出很多,在不同的情况会用不同的输入输出,有的题目在输入时可能换一种输入输出就能不会TLE,有的输入可能要循环输入,但是可以换一种输入直接就能把所有数据输入进去。C/C++有哪些常用的输入输出,在什么时候用它们,这篇博客我会一一详解。

输入

一、cin

cin是C++的输入,是C++里面最常用的一种输入。既可以输入数字,也可以输入字符、字符串。注意,cin输入字符串时,当遇到空格、回车、Tab都会结束。当需要输入空格时,那要用什么,后面会讲解。当输入空格字符时,cin不会把空格读入进去。

#include<iostream>
#include<cstring>
using namespace std;
int n;
string s;
char a,b,c;
int main(){cin>>n;cin>>s;cin>>a>>b>>c;cout<<"数字为:"<<n<<endl;cout<<"字符串为"<<s<<endl;cout<<"字符为"<<a<<" "<<b<<" "<<c<<endl;return 0;
}


二、scanf

用于从标准输入读取格式化的输入,例如整数、浮点数、字符串等,sacnf是C语言的输入,但是广泛应用于C++程序里面,这是因为C语言的scanf比C++的cin快3~4倍,这是因为scanf是用指针操作的,没有类型的安全机制,比如char类型scanf可以用%f输入,而不会报错,但是运行时会出现异常。cin是自动判断你的变量类型,比如char类型,他会用默认的char方法(%c)取数据。这就会影响的效率。

scanf遇到空格、Tab、回车都会结束输入。

当我们看别人程序时前面会出现一行代码,可以用这两行代码实现scanf与cin同步,时间几乎是一样的。

ios::sync_with_stdio(false);
cin.tie(0);

scanf在输入时,就比较个体化了,不同的类型都有不同的输入表示。

#include<iostream>
#include<cstring>
using namespace std;
int n1;
float n2;
double n3;
char ch[100],a,b;
int main(){scanf("%3d%f%lf",&n1,&n2,&n3);//%3d接受三位数字 scanf("%s",ch);//不接受空格、Tab、回车 scanf("%c%c",&a,&b);printf("数字为:%d %.3f %.2f\n",n1,n2,n3);//%f自动转成%lf printf("字符数组为:%s\n",ch);//ch.c_str()printf("字符为:%c %c\n",a,b);//%c可以吃空格 return 0;
} 

注:在C语言中,scanf函数可以用于字符数组,但是在C++中,scanf函数不能直接用于string类。因为string是C++中的一个类,而scanf函数是C语言的函数,并不支持C++的类类型。


三、gets

gets() 函数的功能是从输入缓冲区中读取一行字符串存储到字符指针变量 str 所指向的内存空间。可以接受空格、Tab,但是不接受回车

#include<iostream>
#include<cstring>
using namespace std;
int n1;
float n2;
double n3;
char ch[100],a,b;
int main(){gets(ch); printf("%s",ch);return 0;
} 


四、getchar

getchar()用于从标准输入流获取一个字符。getchar()函数每次从输入流中读取一个字符,并返回该字符的ASCII码值(整数类型)。读取的字符可以是任意可打印字符、控制字符或特殊字符。常用于吃掉回车。

使用getchar()函数时,程序会等待用户从键盘输入一个字符,然后按下回车键确认。之后,函数会将输入的字符返回给程序,并继续执行后续的代码。

#include <stdio.h>int main() {int c;printf("请输入一个字符:");c = getchar();printf("\n你输入的字符是:");putchar(c);return 0;
}

五、fgets

fgets用于从文件流中读取一行字符串。它的原型如下:

char *fgets(char *str, int n, FILE *stream);

参数说明:
- str:用于存储读取字符串的缓冲区的地址。
- n:读取字符的最大数量(包括终止符'\0'),通常为缓冲区的长度。
- stream:文件流指针,指定从哪个文件流读取字符串。

fgets函数会从文件流中读取一行字符,直到遇到换行符'\n'、文件结束符EOF或者读取字符达到了最大数量n-1为止。读取到的字符会存储在str所指向的缓冲区中,并在末尾添加一个终止符'\0'。如果成功读取到字符,则返回str的地址,否则返回NULL。

#include<stdio.h>char ch1[10];
char ch2[10];
int main()
{fgets(ch1,5,stdin);fgets(ch2,5,stdin);printf("ch1=%s\n",ch1);printf("ch2=%s",ch2);return 0;
}

gets是无限读取,fgets有了指定的大小。fgets函数相对于gets函数更加安全,因为它可以指定读取字符的最大数量,避免了缓冲区溢出的风险。同时,fgets函数也可以用于读取文件中的文本行。


六、cin.get

cin.get函数是C++标准库中的一个函数,用于从输入流中读取字符。它的基本语法如下:

cin.get(character);

其中,character为一个字符变量,用于存储从输入流中读取的字符。cin.get函数会读取输入流中的下一个字符,无论该字符是空格、制表符还是换行符。读取成功后,该字符会被存储到character变量中。它可以接受空格,不接受回车,回车结束输入。

cin.get函数可以和其他输入函数(如cin或getline)配合使用,以实现更复杂的输入操作。例如,可以使用cin.get函数读取一个完整的字符串,然后使用其他函数处理该字符串。

示例代码如下:

#include <iostream>
using namespace std;int main() {char character;cout << "请输入一个字符: ";cin.get(character);cout << "您输入的字符是: " << character << endl;return 0;
}

在上述示例中,程序会提示用户输入一个字符,并使用cin.get函数从输入流中读取该字符。然后,程序会将读取到的字符输出到屏幕上。


七、cin.getline

cin.getline用法是从输入流中读取一行字符串,并将其存储到一个字符数组中。它的语法是:

cin.getline(字符数组名, 最大长度, 终止字符)

其中,字符数组名是存储字符串的字符数组的名称,最大长度是字符数组的长度,终止字符是可选参数,用于指定在哪个字符之前终止读取,默认情况下是'\n'。如果读取的字符串的长度超过了最大长度,超出部分的字符将被丢弃。

示例用法:

char name[20];
cin.getline(name, 20);cout << "Hello, " << name << "!" << endl;

在这个例子中,程序将从输入流中读取一个最大长度为19的字符串,并将其存储到名为name的字符数组中。然后,程序会输出一个问候语,其中包括这个读取到的字符串。

需要注意的是,cin.getline函数读取字符数组时会忽略开头的空白字符,并在读取结束后自动添加一个空字符('\0')作为字符串的结束标志。因此,在使用cin.getline函数读取字符串后,可以直接将字符数组作为字符串处理。

注:gets() , cin.getline()和cin.get()不能用在string类型中,五六七都不太常用。


输出

一、cout

cout 是 C++ 标准库中的输出流对象,用于将数据输出到标准输出设备,默认情况下是输出到屏幕上。可以输出数字、字符、字符串等。

在用于四舍五入时可以用iomainp库中的setprecision和fixed函数来输出保留小数位数。

#include <iostream>
#include <iomanip>
using namespace std;int main() {int num = 123;double pi = 3.14159;// 输出整数cout << "The number is: " << num << endl;// 输出小数cout << "The value of pi is: " << pi << endl;cout << fixed << setprecision(2) << pi << endl;//保留两位小数 // 输出字符串cout << "Hello, World!" << endl;return 0;
}

二、printf

printf函数是C语言中的一个输出函数,用于将指定的格式化数据输出。跟scanf一样输出时要用%d等输出,在格式化输出上非常好用。

一般情况下,printf 比cout输出效率更高。

printf是C语言中的输出函数,而cout是C++中的输出流。是一个可变参数函数,可以接受任意数量和类型的参数,并按照格式化的方式输出。相比之下,cout是一个类型安全的输出流,它使用插入(<<)运算符来将数据插入到流中。printf的输出效率高主要是因为它是以低级别的系统调用方式来实现的。它直接使用底层的write函数将数据写入到文件描述符中,绕过了一些高级别的缓冲区和类型安全检查等操作。这使得printf可以更快地将数据输出到终端或文件。而cout则是一个面向对象的输出流,它使用了一些高级别的功能,如类型安全检查、缓冲区管理、输出流状态管理等。虽然这些功能为开发者提供了更多的灵活性和易用性,但也意味着在执行输出操作时需要更多的内存和处理时间。

#include<stdio.h>int main() {int num = 123;printf("The number is %d\n", num); // 输出:The number is 123float f = 3.1415;printf("The value of pi is %.2f\n", f); // 输出:The value of pi is 3.14char str[] = "Hello World";printf("The string is %s\n", str); // 输出:The string is Hello Worldreturn 0;
}

格式控制符用于指定输出的格式,常用的格式控制符包括:

  • %d:输出一个有符号十进制整数。
  • %f:输出一个浮点数。
  • %s:输出一个字符串。
  • %c:输出一个字符。
  • %p:输出一个指针地址。
  • %x:输出一个无符号十六进制整数。

三、putchar

putchar函数用于单个字符的输出,putchar函数在输出单个字符时比较高效,因为它不需要进行格式化操作和缓冲区管理。它直接将字符输出到流中,省去了一些额外的开销。下面是一个简单的使用例子

#include <stdio.h>int main() {int c = 'A';putchar(c);return 0;
}

四、puts

在C / C ++中,puts()函数用于在标准输出上打印字符串,并在最后自动添加换行符。在题目输出一个数组时,可以直接使用puts输出,省去了for循环输出。

#include <stdio.h>
int main() {char str[] = "Hello, World!";puts(str);return 0;
}

该程序将打印出:"Hello, World!",并自动添加换行符。 


参考博客

C++字符串的几种输入方法(string和字符数组)_c++输入字符串数组-CSDN博客

C++语言篇 字符数组与字符串输入_c++字符数组 输入溢出-CSDN博客

相关文章:

详解C/C++输入输出

前言 C/C输入输出很多&#xff0c;在不同的情况会用不同的输入输出&#xff0c;有的题目在输入时可能换一种输入输出就能不会TLE&#xff0c;有的输入可能要循环输入&#xff0c;但是可以换一种输入直接就能把所有数据输入进去。C/C有哪些常用的输入输出&#xff0c;在什么时候…...

AI人工智能开发环境配置

AI人工智能 为什么使用Python来开发AI 人工智能被认为是未来的趋势技术。 已经有了许多应用程序。 因此&#xff0c;许多公司和研究人员都对此感兴趣。 但是这里出现的主要问题是&#xff0c;在哪种编程语言中可以开发这些 AI 应用程序&#xff1f; 有各种编程语言&#xff0c…...

Tomcat 8.5 下载、安装、启动及各种问题

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 本期内容主要介绍 Tomcat 8 的安装&#xff0c;以及可能会遇到的问题 文章目录 1. Tomcat 安装2. 可能会遇到的问题2.…...

Harbor系列之5:复制管理

Harbor的镜像复制功能 Harbor 提供镜像复制功能&#xff0c;允许用户以推送和拉取方式在不同 Harbor 仓库之间&#xff0c;以及 Harbor 与非 Harbor 仓库间&#xff08;如Alibaba ACR、Quay、Aws ECR、Azu热ACR、Docker Registry、Docker Hub等&#xff09;复制 image、chart …...

V.PS德国VPS详细测评

V.PS的德国机房位于法兰克福&#xff0c;默认接入电信CN2 GIA、联通CUII网络&#xff0c;针对中国大陆进行路由优化处理的。而且是强制移动走联通的CUII链路&#xff0c;确保三网都处在轻负载的网络环境下。 CPU是Intel Xeon Gold 6133 &#xff0c;启用了BBR&#xff0c;归属德…...

【Vue3】组件通信之自定义事件

【Vue3】组件通信之自定义事件 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋…...

[CTF]-PWN:ORW题型综合解析

经典ORW&#xff1a; 例题&#xff08;极客大挑战 2019 Not Bad&#xff09;&#xff1a; 这里使用mmap函数创造了一个内存映射区域 从地址0x123000开始&#xff0c;大小位0x1000 权限为可写可执行&#xff08;可读0x1&#xff0c;可写0x2&#xff0c;可执行0x3&#xff09;…...

VSCode中yarn的安装和使用

VSCode只要是做前端的&#xff0c;大家都不陌生&#xff0c;就不讲其使用了。 Yarn是一款高效、可靠的JavaScript包管理器&#xff0c;与NPM类似&#xff0c;但有其独特的优势&#xff0c;如更高效的安装速度、更好的依赖管理等 要在VSCode中使用Yarn&#xff0c;‌需要按照以…...

Java后端面试复习7.23

进程和线程线程优先级线程状态线程构造方式三种推荐用哪种为什么线程中断调用什么方法&#xff0c;本线程怎检查为什么线程不应强制停止线程通信方式四种ThreadLocalFUtureTask线程礼让终止线程的另一个缺陷&#xff08;锁&#xff09;守护线程什么时候设置为守护县城sleep&…...

Arduino PID库 (2) –微分导致的过冲

Arduino PID库 &#xff08;2&#xff09; – Derivative Kick 参考&#xff1a;手把手教你看懂并理解Arduino PID控制库——微分冲击 pid内容索引-CSDN博客 Arduino PID库 &#xff08;1&#xff09;– 简介 问题 此修改将稍微调整derivative term。目标是消除一种称为“…...

基于强化学习算法玩CartPole游戏

什么事CartPole游戏 CartPole&#xff08;也称为倒立摆问题&#xff09;是一个经典的控制理论和强化学习的基础问题&#xff0c;通常用于测试和验证控制算法的性能。具体来说&#xff0c;它是一个简单的物理模拟问题&#xff0c;其目标是通过在一个平衡杆&#xff08;倒立摆&a…...

uniapp0基础编写安卓原生插件和调用第三方jar包(Ch34的jar包)和如何解决android 如何Application初始化

前言 我假设你会uniapp安卓插件开发了,如果不会请看这篇文章,这篇文章是0基础教学。 这篇文章我们将讲一下如何使用CH34XUARTDriver.jar进行开发成uniapp插件。 它的难点是:uniapp如何Application初始化第三方jar包 先去官网下载CH340/CH341的USB转串口安卓免驱应用库:h…...

使用Leaflet进行船舶航行警告区域绘制实战

目录 前言 一、坐标格式转换 1、数据初认识 2、将区域分割成多个点 3、数据转换 4、数据转换调用 二、WebGIS展示空间位置信息 1、定义底图 2、Polygon的可视化 3、实际效果 三、总结 前言 通常而言&#xff0c;海事部门如海事局&#xff0c;通常会在所述的管辖区域内…...

用Ollama 和 Open WebUI本地部署Llama 3.1 8B

说明&#xff1a; 本人运行环境windows11 N卡6G显存。部署Llama3.1 8B 简介 Ollama是一个开源的大型语言模型服务工具&#xff0c;它允许用户在自己的硬件环境中轻松部署和使用大规模预训练模型。Ollama 的主要功能是在Docker容器内部署和管理大型语言模型&#xff08;LLM&…...

计算机毕业设计选题推荐-学生作业管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...

RIP实验

实验拓扑&#xff1a; 实验要求&#xff1a; R1-R2-R3-R4-R5&#xff1a;RIP 100 运行版本2 R6-R7&#xff1a;RIP 200 运行版本1 1.使用合理IP地址规划网络&#xff0c;各自创建环回接口 2.R1创建环回 172.16.1.1/24 172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环…...

手把手教你如何在宝塔上添加可道云登录页面的ICP备案信息,别跟权威开玩笑。

如何在宝塔上添加可道云登录页面的ICP备案信息 事情的原由来我们开始吧首先登录你的宝塔页面双击打开index.php文件保存退出即可 感谢大佬&#xff0c;希望对被查到的朋友有所帮助&#xff01; 事情的原由 今天突然收到腾讯云发来的一封Email&#xff0c;说我需要整改我的网站…...

基于JSP技术的大学生校园兼职系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;JSP 数据库&#xff1a;MySQL 技术&#xff1a;JSPJavaBeans 工具&#xff1a;MyEclipse&#xff0c;Tomcat&#xff0c;Navicat 系统展示 首页 学…...

VSCode在windows系统下的配置简单版

参考链接 从零开始的vscode安装及环境配置教程(C/C)(Windows系统)_vscode搭建编译器环境-CSDN博客 vscode生成tasks.json、launch.json、c_cpp_properties.json文件_vscode生成launch.json-CSDN博客 自动生成配置文件简单方便&#xff01;&#xff01;&#xff01; 运行c代…...

C++初学(9)

9.1、结构简介 虽然数组能够和存储多个元素&#xff0c;但所有元素必须相同&#xff0c;也就是说&#xff0c;同一个数组不能既存放int类型也存放float类型&#xff0c;而C的结构可以满足要求。结构是一种比数组更灵活的数据格式&#xff0c;因为同一个结构可以存储多种类型的…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...