C++ 笔试——常见输入和输出

估计有很多人和我的感受一样,笔试的时候,输入就耗费了很长时间,有几次甚至因为输入的问题,核心思想都想出来了,还是gg了。故此在这里总结c++中常见的输入。

目录

常见输入

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

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

一、以空格为间隔的数组

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

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

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

五、输入字符串string

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

常见输出

具体应用:(字符串输入合法非法去重左移外排)


常见输入

 

基础: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个字符,输入时学生名字之间用逗号隔开,把这五个名字存储并换行输出

#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不会删除缓冲区中的分隔符’,‘  后续输入不能继续进行

 

一、以空格为间隔的数组

input: 

5

1 2 3 4 5


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

int n;
cin>>n;
int *a = new int[n];
for(int i = 0;i < n;i++)
{
    cin >> a[i];
}

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

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

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

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

输出的时候也必须

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

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

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

五、输入字符串string

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

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

      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'

char input[100];
do{
    cin.get(input,100)
    ...

}while(input[0]!='\0')

 

常见输出

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

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

# include<iomanip>
# include<iostream>
using namespace std;

# 小数点后保留两位小数,四舍五入
cout << fixed << setprecision(2) << output << endl;

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

#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)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
 

具体应用:(字符串输入合法非法去重左移外排)

图片摘自网络

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <ctype.h>
#include<set>
using namespace std;

int main() {
	vector<string>valid_vec;//有效的字符串
	vector<string>invalid_vec;//无效字符串
	char input[100];
	do{// 判断是否 输入结束了
		cin.getline(input, 100);
		bool valid = true;
		int i = 0;
		do{//判断字符串是否结束了
			charc = input[i];
			if (!isalnum(c)) {
				valid = false;
				break;
			}
			i++;
		} while (input[i] != '\0');//判断字符串是否结束了
		if (!valid)
			invalid_vec.push_back(input);
		else
			valid_vec.push_back(input);
	} while (input[0] != '\0');//判断输入是否是空行,如果是,就结束了
	// 去重valid_vec存储去重后的
	
	set<string>st(valid_vec.begin(), valid_vec.end());
	valid_vec.assign(st.begin(), st.end());
	
	//输出去重后的合法字符串
	int nums_valid = valid_vec.size();
	for (int i = 0; i < nums_valid-1; i++)
	{
		cout << valid_vec[i] << " ";
	}
	cout << valid_vec[nums_valid - 1]<<endl;
	//输出非法字符串
	int nums_invalid = invalid_vec.size();
	for (int i = 0; i < nums_invalid - 1; i++)
	{
		cout << invalid_vec[i] << " ";
	}
	cout << invalid_vec[nums_invalid - 1] << endl;

	//输出左移10位的
	
	nums_valid = valid_vec.size();
	for (int i = 0; i < nums_valid - 1; i++)
	{
		int remove = 10 % valid_vec[i].length();
		rotate(valid_vec[i].begin(), valid_vec[i].begin()+ remove, valid_vec[i].end());
		cout << valid_vec[i] << " ";
	}
	rotate(valid_vec[nums_valid - 1].begin(), valid_vec[nums_valid - 1].begin() + 10 % valid_vec[nums_valid - 1].length(), valid_vec[nums_valid - 1].end());
	cout << valid_vec[nums_valid - 1] << endl;

	//输出左移然后排序之后的
	sort(valid_vec.begin(), valid_vec.end());
	for (int i = 0; i < nums_valid - 1; i++)
	{
		int remove = 10 % valid_vec[i].length();
		rotate(valid_vec[i].begin(), valid_vec[i].begin() + remove, valid_vec[i].end());
		cout << valid_vec[i] << " ";
	}
	rotate(valid_vec[nums_valid - 1].begin(), valid_vec[nums_valid - 1].begin() + 10 % valid_vec[nums_valid - 1].length(), valid_vec[nums_valid - 1].end());
	cout << valid_vec[nums_valid - 1] << endl;
	return 0;
}



 

  • 17
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值