详解C/C++输入输出

news2024/9/21 15:39:57

前言

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 123

    float f = 3.1415;
    printf("The value of pi is %.2f\n", f); // 输出:The value of pi is 3.14

    char str[] = "Hello World";
    printf("The string is %s\n", str); // 输出:The string is Hello World

    return 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博客

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

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

相关文章

总线学习1--I2C

很久以前就听说总线这个词了&#xff0c;一直不懂&#xff0c;所以觉得很牛叉。。。这次有机会学习&#xff0c;就干脆一起看看吧。 1 环境介绍 说实话&#xff0c;计算机的学习最好还是有个环境&#xff0c;裸学真的要难一些。硬件学习其实难就难在搭环境&#xff0c;之前很多…

生物计算与纳米技术:交汇前沿的科学领域

在当今科技迅猛发展的时代&#xff0c;生物计算和纳米技术作为前沿科技领域的两个重要方向&#xff0c;正在逐渐融合并带来深远的影响。生物计算涉及使用生物系统进行计算和数据存储&#xff0c;而纳米技术则关注制造极小尺度的电子器件和材料科学。本文将深入探讨这两个领域的…

2.2 (1) 处理机调度

文章目录 处理机调度概念处理机调度层次高级调度&#xff08;作业调度&#xff09;中级调度&#xff08;内存调度&#xff09;低级调度&#xff08;进程调度/处理机调度&#xff09;三层调度的联系对比 进程调度的时机需要进行进程调度与切换的情况不能进行进程调度与切换的情况…

【Linux学习】文件系统 - 第一篇

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; &#x1f4d5;文章目录 &#x1f4da;基础知识铺垫&#x1f351;重新使用C语言文件接口---对比重定向&#x1f388;fopen函数&#x1f30f…

[云原生]三、Kubernetes(1.18)

主要内容: 1、kubernetes 简介 2、kubernetes 集群搭建  方式搭建  二进制方式搭建 3、 kubeadm kubernetes 核心技术  YAML 文件详解  kubectl 命令工具  Pod  Label  Controller 控制器 …

node.js使用NodeMachineID 生成唯一UUID和注意事项

node-machine-id用于获取或生成唯一的机器ID 如何使用 const { machineId, machineIdSync } require(node-machine-id) JSON.stringify(machineIdSync({original: true})) ;方法&#xff1a; machineIdSync 此函数同步获取操作系统本机UUID/GUID&#xff0c;默认情况下进行哈…

深入理解 ReLU 激活函数及其在深度学习中的应用【激活函数、Sigmoid、Tanh】

ReLU&#xff08;Rectified Linear Unit&#xff09;激活函数 ReLU&#xff08;Rectified Linear Unit&#xff09;激活函数是一种广泛应用于神经网络中的非线性激活函数。其公式如下&#xff1a; ReLU ( x ) max ⁡ ( 0 , x ) \text{ReLU}(x) \max(0, x) ReLU(x)max(0,x) 在…

嵌入式Linux系统中pinictrl框架基本实现

1. 回顾Pinctrl的三大作用 记住pinctrl的三大作用,有助于理解所涉及的数据结构: * 引脚枚举与命名(Enumerating and naming) * 单个引脚 * 各组引脚 * 引脚复用(Multiplexing):比如用作GPIO、I2C或其他功能 * 引脚配置(Configuration):比如上拉、下拉、open drain、驱…

Java中的五种线程池类型

Java中的五种线程池类型 1. CachedThreadPool &#xff08;有缓冲的线程池&#xff09;2. FixedThreadPool &#xff08;固定大小的线程池&#xff09;3. ScheduledThreadPool&#xff08;计划线程池&#xff09;4. SingleThreadExecutor &#xff08;单线程线程池&#xff09…

CTFHUB-SSRF-DNS重绑定 Bypass

开启题目&#xff0c;页面空白&#xff0c;访问附件 附件是一个知乎的文章&#xff0c;翻到下面点击文中这个链接 跳转之后&#xff0c;进行设置 把得到的链接拼接到题目的后面进行访问&#xff0c;然后得到了本题的 flag

Leetcode3226. 使两个整数相等的位更改次数

Every day a Leetcode 题目来源&#xff1a;3226. 使两个整数相等的位更改次数 解法1&#xff1a;位运算 从集合的角度理解&#xff0c;k 必须是 n 的子集。如果不是&#xff0c;返回 −1。怎么用位运算判断&#xff0c;见上面的文章链接。 如果 k 是 n 的子集&#xff0c;…

Windows Batch Linux Shell

windows上使用unix&#xff0c;Linux的unix工具对应的windows的可执行exe程序&#xff0c;对于本来的windows用户也可以使用这些工具提高工作效率&#xff0c;特别地在windows的批处理中使用这些命令很方便 二 工具列表 agrep.exe ansi2knr.exe basename.exe bc.exe bison.exe…

图像生成技术的颠覆性进展——从GAN到Aura SR V2

欢迎来到我们的科技专栏&#xff01;最近&#xff0c;文本到图像合成技术的成功引起了全球的轰动&#xff0c;激发了公众的无限想象力。从技术角度看&#xff0c;这也标志着在设计生成图像模型的架构上发生了巨大的变化。曾经&#xff0c;生成对抗网络&#xff08;GANs&#xf…

【Material-UI】详解安装指南

文章目录 一、默认安装1.1 Peer Dependencies 二、使用styled-components三、Roboto字体3.1 使用Fontsource3.2 使用Google Web Fonts 四、图标4.1 使用Google Web Fonts 五、CDN安装六、总结 Material-UI是全球最受欢迎的React UI框架之一。它提供了丰富的组件和高度可定制的主…

CSDN 的 Markdown 编辑器图片居中对齐和设置图片大小的方法

图片对齐方式 加在文件格式后面 #pic_center #pic_left #pic_right例如&#xff1a; 居中对齐 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/eb16b0a5bc414b9888ab73f3c74a8acb.png#pic_center)左对齐 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direc…

AI答题应用平台相关面试题

目录 1、请介绍整个系统后端的架构设计&#xff0c;有哪些模块以及各模块之间的关系&#xff1f; 2、你在项目中是如何设计库表的&#xff1f;可以从字段、索引、关联等方面回答。 3、为什么使用策略模式来封装不同的应用评分算法&#xff1f;它有哪些好处&#xff1f;具体如…

Elasticsearch 的DSL查询,聚合查询与多维度数据统计

文章目录 搜索聚合高阶概念 搜索 即从一个索引下按照特定的字段或关键词搜索出符合用户预期的一个或者一堆cocument&#xff0c;然后根据文档的相关度得分&#xff0c;在返回的结果集里并根据得分对这些文档进行一定的排序。 聚合 根据业务需求&#xff0c;对文档中的某个或…

【源码+文档+调试讲解】营业厅宽带系统设计与实现

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本营业厅宽带系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&…

Action部署在线上写文章

原文&#xff1a;https://blog.c12th.cn/archives/32.html 前言 之前分别出了 Hexo 和 Hugo 的 Action搭建教程&#xff0c;相当于伪动态&#xff0c;可以在线上写文章了&#xff1b;不过对于喜欢魔改的同学就不太友好了qwq 教程 github.dev 确保在配置过程中能访问Github &…

学工系统学生家庭情况登记功能概述

智慧校园学工系统中的“学生家庭情况”模块主要用于收集和管理学生的家庭背景信息&#xff0c;以便学校更好地了解学生的情况&#xff0c;并据此提供相应的支持和服务。该模块通常包括以下几个方面&#xff1a; 基本信息录入&#xff1a;支持录入学生的家庭成员信息&#xff0c…