解密输入输出迷局:蓝桥杯与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或其他编程比赛中遇到的输入输出问题提供一些帮助。通过深入理解这些常见问题的解决方法,我们可以更自信、更高效地应对挑战,展示出我们在编程领域的才华和技能。祝您取得优异的成绩~

最近更新

  1. TCP协议是安全的吗?

    2024-02-09 12:20:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-09 12:20:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-09 12:20:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-09 12:20:03       18 阅读

热门阅读

  1. C++ [NOIP2007 提高组] 矩阵取数游戏

    2024-02-09 12:20:03       28 阅读
  2. lnmp指令

    2024-02-09 12:20:03       33 阅读
  3. C++中的递归算法

    2024-02-09 12:20:03       31 阅读
  4. 力扣刷题-392.判断子序列

    2024-02-09 12:20:03       26 阅读
  5. C语言中的作用域与生命周期

    2024-02-09 12:20:03       26 阅读
  6. 前端开发:(六)Vue快速入门

    2024-02-09 12:20:03       26 阅读
  7. GraphicsMagick 的 OpenCL 开发记录(三十四)

    2024-02-09 12:20:03       28 阅读
  8. c++学习:数组

    2024-02-09 12:20:03       25 阅读
  9. 开源大型语言模型概览:多语种支持与中文专注

    2024-02-09 12:20:03       31 阅读
  10. openssl3.2 - exp - RAND_bytes_ex

    2024-02-09 12:20:03       27 阅读
  11. 程序设计进阶——C语言(翁凯版)第五周

    2024-02-09 12:20:03       31 阅读