本文是对《算法笔记》一书中的内容进行整理,方便自己复习,如果想详细阅读相关内容,推荐阅读《算法笔记》。
1. 输入输出
在算法题目中,我们经常需要自己处理输入输出。因此,掌握常用的输入输出方法利于方便的处理问题,将精力聚焦在题目具体的逻辑上,从而更利于解题。下面介绍常用的输入输出函数。
1.1 scanf()读取输入
scanf()函数在c和cpp中均有很广泛的应用场景,一般情况下,使用scanf比单纯的使用cin要快一些,而且由于scanf具有的格式化输入,使得其应用场景更加广泛。
格式: scanf("格式控制",变量地址)
1. scanf的双引号内的内容就是整个输入,只需要将数据换成对应的格式符并将变量地址按次序写在后面即可。
// 测试 13:45:20这种 hh:mm:ss 格式的输入
void test1(){
int hh, mm, ss;
scanf("%d:%d:%d",&hh,&mm,&ss);
cout << hh <<":" << mm << ":" << ss << endl;
printf("%d:%d:%d",hh,mm,ss);
}
- 除了 %c 读入字符外,scanf对其余格式的输入以空白符(即空格、换行)为结束的标志,会跳过空格,因此scanf读取输入空格可以省略。
// 测试 "3 4" scanf读取输入时中间空格可以省略。
void test2(){
int a,b;
scanf("%d%d",&a,&b);
cout << a << b << endl;
}
- scanf的 %c 格式可以读取空格和换行。如果想读取带有空格的一行内容,使用fgets读取,但注意fgets不会删除行末的回车字符。
// 使用fgets读取包含空格的一整行内容,fgets(str,100,File*),这里可以从stdin读入。
void test3(){
char str[100];
fgets(str,100,stdin);
fputs(str,stdout);
}
- 数组名称代表数组第一个元素地址,不需要再加取地址符号。
1.2 printf
printf和scanf通常配套使用。这里对其常用方法进行总结。
- double类型的输出,格式为%f, scanf读取输入为%lf.
#include <iostream>
int main(){
double d1 = 8765.4, d2 = 8765.4
printf("%f\n",d1*d2);
return 0;
}
- printf中可以使用转义字符,所以想输出%或,需要在前面再加一个%或\.
- %0md:使不足m位的int变量以m位进行右对齐输出,其中高位用0补齐,若本身超过m位,则保持原样。
/*
%md:使不足m位的int型变量以m位进行右对齐输出,其中高位用空格补齐,超过m位保持原状。
*/
#include <iostream>
int main(){
int a = 123, b = 1234567;
printf("%05d\n",a);
printf("%05d\n",b);
return 0;
}
/*
00123
1234567
*/
- %.mf:使浮点数保留m位小数输出。
#include <iostream>
int main(){
double d1 = 12.3456;
printf("%.0f\n",d1); // 12
printf("%.1f\n",d1); // 12.3
printf("%.2f\n",d1); // 12.34
}
2.字符数组的初始化与输入输出
2.1 字符数组的初始化
字符数组的初始化方式有两种,一种是同普通数组初始化一样通过大括号枚举元素进行初始化,另一种是通过字符串对字符数组进行初始化。
// 字符数组的初始化
void test1(){
// 1. 大括号枚举方式初始化
char str1[20] = {'H','e','l','l','o'};
printf("%s\n",str1);
// 2. 字符串赋值初始化
char str2[20] = "Hello str2";
puts(str2);
cout << "使用cout 输出字符数组 " << endl;
cout << "str1 = " << str1 << endl;
cout << "str2 = " << str2 << endl;
}
2.2 字符数组的输入与输出
2.2.1 字符数组的输入
同普通变量的输入输出一样,字符数组的输入输出也有多种方式,以下对字符数组常用的输入方式进行总结。
1. scanf()
scanf("%s",str):使用%s读入字符串存入字符数组中,以换行和空格作为输入结束的标识。此时不需要加&
scanf("%c",&str):使用%c读入单个字符,%c可以识别空格和换行并将其输入。
// 字符数组的输入scanf:以换行和空格作为结束输入的标识。
void test2(){
char str1[20];
// 1. scanf()输入。以换行和空格作为输入结束的标识。
scanf("%s",str1);
/*
输入: PAT PAT PAT
输出:PAT
*/
cout << "scanf()读入以空格和换行作为结束标识:" << str1 << endl;
}
// 读入单个字符时 scanf需要加&符号
void test7(){
char str;
scanf("%c",&str); // 读入单个字符时,需要加&
printf("输出:%c\n",str);
}
2. getchar()
getchar():输入单个字符,可以将输入中的换行和空格读入。
// getchar读入单个字符,可以读入空格和换行。
void test3(){
// 2. getchar读入单个字符
char c1,c2,c3;
c1 = getchar();
getchar();
c2 = getchar();
c3 = getchar();
/*
1.
输入: abcd
输出: c1 = a c2 = c c3 = d
b 被 第58行getchar()读入。
2. getchar读入换行符。
输入:ab 'enter'
c 'enter'
输出:c1 = a c2 =
c3 = c
因为getchar可以识别换行符,所以c2存储的是换行符: \n 在ac中有换行符出现。
3. getchar读入空格
输入:a b c
输出:c1 = a c2 = b c3 =
*/
cout << "c1 = " << c1 << " c2 = " << c2 << " c3 = " << c3 << endl;
}
3. fgets()
fgets可以读入嵌入空格的字符串到字符数组中。
fgets(char* str, int size, stdin): str是字符数组,size通常是一个非常大的数,stdin是标准输入流。
// fgets读入带有空格的一行输入,以换行作为结束输入的标志。
void test4(){
/*
输入:abcd efg
输出:fgets 可以读入带有空格的一行输入 abcd efg
*/
char str[20];
fgets(str,1024,stdin);
cout << "fgets 可以读入带有空格的一行输入 " << str << endl;
}
4. getline()
getline(cin,inputline):读取整行,包括前导和嵌入的空格,并将其存放到字符串对象中,inline是接收字符串的string变量名。
// getline(cin,lineinput):读入包含前导空格和嵌入空格的输入并存储到字符串对象lineinput中。
void test6(){
/*
输入: abc edf
输出:getline读入带有前导和嵌入的到字符串对象str中: abc edf
*/
string str;
getline(cin,str);
cout << "getline读入带有前导和嵌入的到字符串对象str中: " << str << endl;
}
5. cin
cin: 不能输入包含空格的字符串,以空格和换行作为结束输入的标志。
//cin 不能读入带有空格的字符串
void test5(){
/*
输入:ab cd
输出:cin 不能读入带有空格的字符串:ab
*/
char str[20];
cin >> str;
cout << "cin 不能读入带有空格的字符串:" << str << endl;
}
6. gets()
gets(char* str):gets识别换行符作为输入结束的标志。[现在已经废弃,不建议使用]
2.2.2 字符数组的输出
相较于字符数组的输入,字符数组的输出较为简单,这里对其进行简单总结如下:
1. printf()
printf("%s",str):输出字符串
printf("%c",str):输出单个字符
2. putchar()
putchar(str):输出单个字符。
3. puts()
puts(str):输出一行字符串
4. cout
cout:常用输出流
3. sscanf和sprintf
sscanf(str, "%d", &n); 将字符数组str中的内容以"%d"的格式读入到n中。(自左向右)
sprintf(str, "%d", n); 将n以"%d"的格式存储到字符数组str中。(自右向左)
// sscanf(str,"%d",&n):将字符数组str中的内容以"%d"的格式输入到n中
void test8(){
int n;
char str[20] = "123";
sscanf(str,"%d",&n);
printf("%d\n",n);
}
// sprintf(str,"%d",n):将n以"%d"的格式输入到字符数组str中.
void test9(){
int n = 233;
char str[20];
sprintf(str,"%d",n);
printf("%s\n",str);
}
可以使用sscanf和sprintf进行复杂的格式输入输出。
void test10(){
int n;
double db;
char str[100] = "2048:3.14,hello", str2[30];
sscanf(str,"%d:%lf,%s",&n,&db,str2);
printf("n = %d, db = %.2f, str2 = %s\n",
n,db,str2);
}