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