C++ 笔试注意事项

本文主要目的就是为了排除笔试与面试之中写C++代码时候的坑及各种低级错误。

一 常见错误

  1. 声明指针数组时
1
int new a[10];

千万不要用()

1
2
3
A (*ga)[n] = new A[m][n]; 
...
delete []ga;
  1. 条件表达式中的===区分开
  2. 变量名不要抄错
  3. 过不了的时候 尝试使用long换int

二 标准输入输出

2.1 常见输入

基础:cin / cin.getline / cin.get / getline(string)简单用法

  1. Tab、space结束符。enter是判断输入流结束的表现。不要把他和普通的结束符看成一样的。
  2. cin.getline / cin.get都是遇到enter会终止,但不同的是,cin.getline会把缓冲区当中的enter删除掉,不影响下一次的输入。而cin.get不会删除。
  3. getline(string):Get line from stream into string (function ),不是遇到space tab就结束的,会记录下字符串当中的space。

零、’,’ 作为输入分隔符

例题:输入五个学生的名字,每个学生的名字不超过10个字符,输入时学生名字之间用逗号隔开,把这五个名字存储并换行输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
using namespace std;
int main()
{
char a[5][10];
int i;// 每次遇到',' 就终止了 ,不保留在缓冲区。
for(i=0;i<4;i++)cin.getline(a[i],10,',');
// 最后一个是输入5'/n'没有','不符合上面的式子,需要重新把缓冲区中的读出来
cin.getline(a[i],10);
for(i=0;i<5;i++)
cout<<a[i]<<endl;
}

input:1,2,3,4,5(最后必须有enter保证跳出了输入流)
out:
1
2
3
4
5

这样我们就可以完成完成用任何符号作为分割符的输入了!此处getline换成get是不行的,因为cin.get不会删除缓冲区中的分隔符’,‘ 后续输入不能继续进行

一、以空格为间隔的数组

1
2
3
input: 
5
1 2 3 4 5

注意1 2 3 4 5之后有enter,enter是判断输入流结束的表现。

1
2
3
4
5
6
7
int n;
cin>>n;
int *a = new int[n];
for(int i = 0;i < n;i++)
{
cin >> a[i];
}

二、多组测试数据(while(cin>>…))

1
2
3
4
5
6
7
8
9
10
11
12
13
比如 输入的N组数据
/*
5
1 2 3 4 5
3
123
...
*/
int n;
while(cin>>n){ //while cin这里
int* a = new int[n];
...
}

三、无空格 的字符串,cin>> , 如果是char[] memset

1
2
3
4
5
6
#include<string.h>//和string是两个东西!!
char out[8];
memset(out,'0',8);//初始化注意
char str[30];
cin>>str;
//也可以用string,但是都不记录空格

输出的时候也必须

1
2
3
 for(int i =0;i<8;i++){//必须是这种
cout<< out[i]; //否则会出现 烫烫
}

四 、有空格的字符数组:cin.getline(不记录’\n’) or cin.get(记录’\n’)

1
2
3
char str[30];
cin.getline(str,30);//读入整行数据,它使用回车键输入的换行符来确定输入结尾。
//cin.get(str,len);//这个还会保留换行符

五、输入字符串string

1
2
3
4
# include<string>
string str;
getline(cin,str);
//cin>>str;不能包含空格了

输入: 1 2 3 4 5
2 3 4 5 6

1
2
3
4
5
6
7
8
while (cin >> m) {
a.push_back(m);
if (cin.get() == '\n') break;
}
while (cin >> n) {
b.push_back(n);
if (cin.get() == '\n') break;
}

六、以空(‘/0’)作为输入的结束,第一个字符为’\0’ input[0]!=’\0’

1
2
3
4
5
char input[100];
do{
cin.get(input,100)
...
}while(input[0]!='\0')

2.2 常见输出

c++默认的流输出数值有效位是6,包括整数和小数,若数值超出6位,则第七位四舍五入到6位数

fixed :浮点值显示为定点十进制。 默认是小数6位数,不包含整数,若小数位超出6位,则四舍五入到6位数

1
2
3
4
5
# include<iomanip>
# include<iostream>
using namespace std;
# 小数点后保留两位小数,四舍五入
cout << fixed << setprecision(2) << output << endl;

以下这个案例摘录自:http://c.biancheng.net/view/275.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int n = 141;
//1) 分别以十六进制、十进制、八进制先后输出 n
cout << "1)" << hex << n << " " << dec << n << " " << oct << n << endl;
double x = 1234567.89, y = 12.34567;
//2)保留5位有效数字
cout << "2)" << setprecision(5) << x << " " << y << " " << endl;
//3)保留小数点后面5位
cout << "3)" << fixed << setprecision(5) << x << " " << y << endl;
//4)科学计数法输出,且保留小数点后面5位
cout << "4)" << scientific << setprecision(5) << x << " " << y << endl;
//5)非负数显示正号,输出宽度为12字符,宽度不足则用 * 填补
cout << "5)" << showpos << fixed << setw(12) << setfill('*') << 12.1 << endl;
//6)非负数不显示正号,输出宽度为12字符,宽度不足则右边用填充字符填充
cout << "6)" << noshowpos << setw(12) << left << 12.1 << endl;
//7)输出宽度为 12 字符,宽度不足则左边用填充字符填充
cout << "7)" << setw(12) << right << 12.1 << endl;
//8)宽度不足时,负号和数值分列左右,中间用填充字符填充
cout << "8)" << setw(12) << internal << -12.1 << endl;
cout << "9)" << 12.1 << endl;
return 0;
}

程序的输出结果是:

1
2
3
4
5
6
7
8
9
1 8d 141 215
2 1.2346e+06 12.346
3 1234567.89000 12.34567
4 1.23457e+06 1.23457e+01
5 ***+12.10000
6 12.10000****
7 12.10000
8 -***12.10000
9 12.10000
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 guoben
  • PV: UV:

微信