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

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

带空格的字符串:

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

C 复制代码
#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开始呢?

C 复制代码
#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'的结果是一个数字.

c++ 复制代码
#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的类型的时候,会不能读入空格和回车如下.

C 复制代码
#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;
}
字符数组:
C 复制代码
#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快好几倍。

c++ 复制代码
#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代表结束,我们应该这样写。

c++ 复制代码
 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.

c++ 复制代码
#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一般应该将时间复杂度控制在10^7-10^8 比较好,当然了我们可以在输入输出上做一些操作,减少输入输出上的时间。

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

输出:

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

  • %d:用于输出带符号的十进制整数。
  • %u:用于输出无符号的十进制整数。
  • %f:用于输出浮点数。
  • %c:用于输出字符。
  • %s:用于输出字符串
  • %p:用于输出指针的地址。
  • %x:用于输出十六进制整数(小写字母)。
  • %X:用于输出十六进制整数(大写字母)。
  • %o:用于输出八进制整数。
c# 复制代码
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("类型",地址)
C 复制代码
scanf("%d%d",&n,&k);
scanf("%d", &a[i]);
scanf("%d",&n);  //输入一个整数 
C 复制代码
    scanf("%d %d %d", &num1, &num2, &num3);
常量输出:

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

c 复制代码
printf("%d ",skt[tt])
printf("-1 ")

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

c# 复制代码
puts("Yes");
puts(""); //会自动输出回车
c 复制代码
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。它可以用来快速初始化内存块,将其填充为指定的值.

C 复制代码
#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;
}

常用的值:

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

相关推荐
小刘|15 分钟前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
jjyangyou19 分钟前
物联网核心安全系列——物联网安全需求
物联网·算法·安全·嵌入式·产品经理·硬件·产品设计
xinghuitunan34 分钟前
蓝桥杯顺子日期(填空题)
c语言·蓝桥杯
van叶~36 分钟前
算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝
c++·算法
Half-up36 分钟前
C语言心型代码解析
c语言·开发语言
简简单单做算法37 分钟前
基于Retinex算法的图像去雾matlab仿真
算法·matlab·图像去雾·retinex
knighthood20011 小时前
解决:ros进行gazebo仿真,rviz没有显示传感器数据
c++·ubuntu·ros
云卓SKYDROID1 小时前
除草机器人算法以及技术详解!
算法·机器人·科普·高科技·云卓科技·算法技术
懒大王就是我1 小时前
C语言网络编程 -- TCP/iP协议
c语言·网络·tcp/ip
半盏茶香1 小时前
【C语言】分支和循环详解(下)猜数字游戏
c语言·开发语言·c++·算法·游戏