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

解密输入输出迷局:蓝桥杯与ACM中C++/C语言常见问题揭秘

关于C++中的常见输入输出汇总

带空格的字符串:

​ 对于这种输入方式我们选择使用gets() 函数来进行输入,gets用于从标准输入(通常是键盘)读取一行文本并将其存储为字符串,直到遇到换行符(‘\n’)为止的所有字符。

#include <iostream>
#include <algorithm>
#include<cstring>
using namespace std;
typedef long long LL;

int main()
{
  	char arr[100];
	gets(arr);  
	cout<<arr<<endl;
	cout<<strlen(arr)<<endl;// 字符型

    return 0;
}

在这里插入图片描述

使用gets函数能解决很多问题,所有也推荐给大家使用。

那么如果我们想让输入的数据从下标1开始呢?

#include <iostream>
#include <algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
int main()
{
    char arr[100];
	gets(arr+1);   //+1 就是从1开始 此时 下标为的0的位置使用了,但是没有赋值
	cout<<arr<<endl;
	cout<<arr[0]<<endl;
	cout<<strlen(arr)<<endl;
    return 0;
}


在这里插入图片描述

字符比较:

​ 字符会按照ASECII码一个个进行比较,C++会将字符串从第一个字符开始逐个进行比较,直到找到不同的字符,然后根据不同字符的字典序来确定比较结果。
​ 当一个整数与一个字符相加时,会将整数视为其对应的ASCII码。因此,4 + 'a’的结果是一个数字.

#include <iostream>
#include <algorithm>
#include<cstring>
using namespace std;

typedef long long LL;

int main()
{
   	cout<<'a'+2<<endl;//结果是99 
 	 cout<<('a'>'b')<<endl;//97>98
	cout<<('a'<'b')<<endl;//97<98
	cout<<('a'=='a')<<endl;
 
    return 0;
}


在这里插入图片描述

字符串输入:

对于字符串一般有两种输入方式,要么当成字符数组,要么当成string。
string:

​ 当作string的类型的时候,会不能读入空格和回车如下.

#include <iostream>
#include <algorithm>
#include<cstring>
#include<string>
using namespace std;

typedef long long LL;

int main()
{
  
  	string a;
  	cin>>a;
  	cout<<a[0]<<" "<<a.length()<<endl;
  	cout<<a<<endl;

    return 0;
}


在这里插入图片描述

字符数组:
#include <iostream>
#include <algorithm>
#include<cstring>
#include<string>
using namespace std;

typedef long long LL;

int main()
{
  char ne[1000];
	cin>>ne+1;  //从下标为1开始读入,如果不写一般从0开始
	cout<<ne[0]<<endl;
	cout<<ne[1]<<endl; 
	
    return 0;
}


在这里插入图片描述

当然更推荐使用scanf来进行读入,scanf的读入效率比cin快好几倍。

#include <iostream>
#include <algorithm>
#include<cstring>
#include<string>
using namespace std;

typedef long long LL;

int main()
{
 
 	char ne[1000];
	scanf("%s",ne+1);//%s 表示字符串类型   ne+1表示下标为1的元素所在地址
	cout<<ne[0]<<endl;
	cout<<ne[1]<<endl;

	
    return 0;
}


关于多组输入:

​ 在一些算法题中,可能会个操作,比如1代表某种操作,2代表某种操作,可能一般会说从输入0,0代表结束,我们应该这样写。

 while (cin >> a >> b , a||b) //a和b同时为0 逻辑或运算为0 
    {
        if (a > b) swap(a, b);

        for (int i = 0; i <= 9; i ++ )
            cout << count(b, i) - count(a - 1, i) << ' ';
        cout << endl;
    }

二维数组:

​ 在一些题目中,如果想让我输出二维数组中的每一个元素,我们应该怎么输入呢?char[10][8]其实是由10个一维数组构成的,每一个一维数组长度是8.

#include <iostream>
#include <algorithm>
#include<cstring>
#include<string>
using namespace std;

typedef long long LL;

int main()
{
  char ne[10][10]={"asasd","adnks"};
  for(int i=0;i<2;i++) puts(ne[i]); //一维数组

    return 0;
}


在这里插入图片描述

关于oj速度:

​ 在算法题中一般要求是1s1s一般应该将时间复杂度控制在107-108 比较好,当然了我们可以在输入输出上做一些操作,减少输入输出上的时间。

​ 建议使用scanf代替cin,用printf代替cout,如果输入数据比较多,可以提高好几倍的速度。

输出:

printf() 是C语言中用于输出格式化字符串的函数。它的基本语法是:
printf("format string", arguments),这里大家可以理解前面第一个参数是一个带有占位符的参数,后面的参数就是真正代替占位符的变量值。
format string 中可以包含普通的字符,用于直接输出,也可以包含转换说明符,用于格式化输出。

  • %d:用于输出带符号的十进制整数。
  • %u:用于输出无符号的十进制整数。
  • %f:用于输出浮点数。
  • %c:用于输出字符。
  • %s:用于输出字符串
  • %p:用于输出指针的地址。
  • %x:用于输出十六进制整数(小写字母)。
  • %X:用于输出十六进制整数(大写字母)。
  • %o:用于输出八进制整数。
printf("Number: %d\n", num);  // num 会代替%d 这个值
printf("Pi: %.2f\n", pi); //pi 会代替  %.2f 这个值
printf("Letter: %c\n", letter);//letter 会代替%c 
printf("Name: %s\n", name);
// 结果-----------------
Number: 42
Pi: 3.14
Letter: A
Name: John

scanf("%d",&n); //如果数据量比较大的时候,一般使用c语言格式进行输入!!!
printf("%d",arr[i]) //c语言输出

注意:printf 不会在输出结尾出自动添加换行符号。 可以添加\n.

输入:

一般使用C语言读入方式读入整数和字符,语法:

  • scanf("类型",地址)
scanf("%d%d",&n,&k);
scanf("%d", &a[i]);
scanf("%d",&n);  //输入一个整数 
    scanf("%d %d %d", &num1, &num2, &num3);
常量输出:

printf 不会在输出结尾出自动添加换行符号。

printf("%d ",skt[tt])
printf("-1 ")

​ puts 函数会自动在结尾处添加换行符号,puts函数只能用于输出字符串,而不支持格式化输出。如果你需要输出其他类型的数据或者进行格式化输出,应该使用printf函数。一句话:只能输出长亮。

puts("Yes");
puts(""); //会自动输出回车
puts(str); //会自动换行
puts(str+1); //从下标为1的开始输出

初始化数组:

memset 是 C 和 C++ 中的一个函数,用于将一块内存设置为指定的值。

void *memset(void *ptr, int value, size_t num);

其中:

  • ptr 是指向要设置的内存块的指针。
  • value 是要设置的值,通常是一个整数,字节。
  • num 是要设置的字节数。

memset 函数将 ptr 指针所指向的内存块的前 num 个字节都设置为 value。它可以用来快速初始化内存块,将其填充为指定的值.

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

int main() {
    int array[5];
    // 将数组元素设置为 0
    memset(array, 0, sizeof(array));
    // 打印数组元素
    for (int i = 0; i < 5; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");

    return 0;
}

常用的值:

memset(array, 0, sizeof(array)); //数组都初始化为0
memset(array, -1, sizeof(array));//都初始化-1
memset(array, 0x3f, sizeof(array));//都初始化为0x3f3f3f3f

总结:

在本文中,我们深入探讨了蓝桥杯、ACM等比赛中常见的C++和C语言输入输出问题。通过案例分析,我们学习了字符输入、字符串输入、二维数组以及puts()、printf()、scanf()、memset()等函数的使用技巧。同时,我们也对比了C++的输入流对象cin和C语言的输入函数scanf的效率。

在实际比赛中,了解这些输入输出迷局的解决方法至关重要。通过掌握正确的技巧和函数使用方式,我们可以更高效地处理输入输出,节省宝贵的时间和精力。然而,需要注意的是,尽管scanf函数在效率上可能稍优于cin流对象,但cin提供了更高的安全性和可靠性,能够处理更广泛的输入情况,特别是对于字符串输入和格式化输入。因此,在实际应用中,我们应根据具体情况选择合适的输入输出方式。

希望本文能为您在蓝桥杯、ACM或其他编程比赛中遇到的输入输出问题提供一些帮助。通过深入理解这些常见问题的解决方法,我们可以更自信、更高效地应对挑战,展示出我们在编程领域的才华和技能。祝您取得优异的成绩~


http://www.kler.cn/a/233145.html

相关文章:

  • Qt 实现文件监控程序
  • 分享一个傻瓜式一键启动的加速器
  • GitLab 如何跨版本升级?
  • c#使用COM接口设置excel单元格宽高匹配图片,如何计算?
  • RAFT: Recurrent All-Pairs Field Transforms for Optical Flow用于光流估计的循环全对场变换
  • Prompt 工程
  • 【Java八股面试系列】JVM-常见参数设置
  • 【网工】华为设备命令学习(Telnet)
  • 【51单片机】外部中断和定时器中断
  • 【C/C++】整数及乘积的溢出问题
  • CSS综合案例4
  • Vue ElementUI中el-table表格嵌套样式问题
  • github和gitee
  • Excel+VBA处理高斯光束
  • 全网最快2024刘谦春晚魔术揭秘
  • ssh和sftp服务分离
  • 关于LLaMA Tokenizer的一些坑...
  • 【征稿已开启】第五大数据、人工智能与软件工程国际研讨会(ICBASE 2024)
  • Elasticsearch中的动态DSL解决方案
  • Android 自定义BaseActivity
  • ES实战-book笔记1
  • OCP使用web console创建和构建应用
  • .gitlab-ci.yml文件参数
  • 极狐GitLab 与钉钉的集成实践
  • C++的学习记录
  • [office] excel求乘积的公式和方法 #媒体#笔记#经验分享