【编程之路】OJ题中的变态输入总结

在做oj时,每一个平台的输入方式都会有所不同,只要你读懂问题,读懂题目要求在掌握一点输入的方法,基本上都可以解决题目的输入问题。但是未免有一些变态至极的题目。(见下题)

变态题:(只看输入)

输入要求

	要求程序首先输入一个整数N(N<100)表示后面数据行数。
	接着读入N行数据。
	每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000)
	每个整数代表一个ID号。

输入样例

6
164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196
172 189 127 107 112 192 103 131 133 169 158
128 102 110 148 139 157 140 195 197
185 152 135 106 123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190
149 138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194 187 188
113 130 176 154 177 120 117 150 114 183 186 181 100 163 160 167 147 198 111 119

思想

  1. 一看到输入,我想大家和我一样非常棘手,不知道怎么输入长度不等的数据。如果定义二维数组的话,由于每行数据是不定长的,所以我们不知道每一行什么时候截止,也就是说内层循环没有办法判断。
  2. 我们再来想,这种奇葩的输入,不能一个个的输入到数组中,那我们只能用string对象接收每一行的数据,然后在对string对象中的数据进行提炼,将字符串中的数字字符转化成整形放入数组中(因为有空格间隔,方便将数字字符转化成整形)。
  3. 我们进一步的想,有没有进行string对象划分的函数呢。其实有getline()函数就有这样的功能。不过getline()的第一个参数是必须是一个输入流对象。(见代码详解)。
  4. 我们最终需要将string对象化作整形,可以运用stringstream流对象完成string转化为int

输入方法

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

void s2i(string &str, int & num)  // 将字符串转换为整形
{
	stringstream ss;  //利用stringstream对象将字符串转化为整形
	ss << str;
	ss >> num;
}
int main()
{
	int  data[100];
	int line = 0;
	int index = 0;
	cin >> line;  //因为最后还要打一个换行符
	getchar();    // 吸收结尾的换行符,因为后面要getline
	for(int i = 0; i < line; ++i)
	{
		string s;
		getline(cin,s);        // 从控制台的标准输入写入 s中
		istringstream iss(s);  // 将字符串s封装到istringstream对象中,再以它为输入
		string tmp;
		while(getline(iss,tmp,' '))  //将新的输入流,按照‘ ’进行分割,放到string对象的tmp中
		{
			s2i(tmp,data[index++]);  // 将tmp转化成int型,写进数组data中
		}
	}
	//最终的index就是数据的个数
	cout << index <<endl; //验证index是否正确
}

总结:整体的输入过程就是

  1. 先从标准输入流当中得到一个字符串
  2. 再将这个字符串封装到istringstream对象iss当中
  3. 这次在利用getline()函数第三个参数进行分割以’ '分割,并且将分割的每一个小的对象放入tmp中

OJ题目输入需注意事项

我们需要在oj输入中掌握一些小的方法:

输入的小方法

stringstream

作用:
简便快速的将整形化为string,或者string对象转化为整形。 详细的见https://blog.csdn.net/weixin_43939593/article/details/105114509

getline(cin,str)

作用:
从标准输入流当中,也就是从控制台的标准输入流当中输入到这个字符串str中将标准的输入流。以换行符(也就是回车)作为结尾标志。

使用场景:
当输入一条数据的时候,数据中间有 空格。
比如 : 12321 34dsa 。
你可以直接将这一行数据输入到str对象中,然后按题目要求(有可能是要转化整形,也有可能直接操作)

输入的时候什么时候用getchar() ?

原因

cin >> n;           // 此时你输入完n以后,按下回车('\0')
getline(cin,str);   // 这里不会在提醒你输入str了, 因为这里的str已经吸收你上面的'\0'了

场景
当你输入一个整数n的时候,接下来要输入每一行,也就是getline(cin,str)的时候,你要在输入完整数n之后,用一下getchar(),作用就是吸收结尾的换行符。 要是不吸收换行符的话,你的getline(cin,str),写入str的就是换行符。

个人总结

如果OJ题目中的没有说的很明白,全部转化为string对象做。再根据题目拆分成需要的。

比如让你求n个数中的最大值,只让你输入多个数,没有让你输入n是多少,

	样例1:
	1  4  0  8  7
	结果:
	8
	样例2:
	9  9  9  9  9  10
	结果:
	10

我们只能将标准输入输入到字符串str中,因为有空格,所以我们不能直接cin >> str。要用getline(cin,str)。然后在将str中以空格间隔的数从字符串转化为整数。进行操作。
方法1: 我们平常写的string转化为int的函数
方法2: 上面例题中,可以借助 getline(istringstream,tmp,’ ') 和 stringstream进行转化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值