前沿:
参加了不少官方在线笔试,遇到编程题,明明有思路却被如何输入数据所阻隔。看见在线编程无数次报错,疯狂点击提交按钮却无济于事。这也太悲催了。
所以我先整理一些常见的C++输入数据的方式,以避免一次次的痛苦qaq~
正文
先看一个输入的题
链接:https://ac.nowcoder.com/acm/contest/320/G
来源:牛客网
输入描述:
输入数据有多组, 每行表示一组输入数据。
每行不定有n个整数,空格隔开。(1 <= n <= 100)。
输出描述:
每组数据输出求和的结果
示例1
输入
复制
1 2 3
4 5
0 0 0 0 0
输出
复制
6
9
0
//首先我们不知道有多少个数组,每一行第一个元素都是该数组的大小。所以肯定是while一直输入遇到不输入的情况再停下来。
1.好用的scanf("%d",&a)!=EOF
一直循环输入,先读第一行第一个数,再读剩下的数,输出结果。然后第二次循环读第二行第一个数,在读剩下的数
#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
int n;
int temp;
while (scanf_s("%d", &n) != EOF)
{
int count = 0;
for (int i = 0; i < n; i++)
{
cin >> temp;
count += temp;
}
cout << count << endl;
}
cout << "结束" << endl;
return 0;
}
注:这个是C中函数scanf,用的时候要加#include<stdio.h>
介绍下scanf返回的值,即输入成功的个数。
scanf("%d%d",&a,&b);若a,b都被输入进来返回2;若只有ab中一个被赋值返回1,若都没赋值返回EOF文件结束符。
那什么情况下会都赋值成功,什么情况下会只有一个,什么时候一个都么有呢?
这取决与我这个scanf读的范围。看读的范围里有几个数
那scanf读的范围是什么呢?是一个回车之前的所有东西吗,是
2.getline(cin, input)和istrin
gstream
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <sstream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <queue>
#include <stack>
#include <map>
#include <iterator>
#include <set>
using namespace std;
int main()
{
string input;
istringstream iss;
while (getline(cin, input))
{
iss.clear();
iss.str(input);
int temp = 0, res = 0;
while (iss >> temp)
res += temp;
cout << res << endl;
}
return 0;
}
3.cin.get() == '\n'以回车作为结束符
比如以下,运用list
-
list<int> p; -
int n=0; -
//构造链表 -
int b; -
while(cin>>b) -
{ -
p.push_back(b); -
n++; -
if (cin.get() == '\n') -
break; -
}
或者是利用 vector
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <sstream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <queue>
#include <stack>
#include <map>
#include <iterator>
#include <set>
using namespace std;
int main()
{
int temp;
vector<int> a;
while (cin>>temp)
{
a.push_back(temp);
if (cin.get() == '\n')
{
break;
}
}
return 0;
}
4.cin.fail() 、cin.eof()、cin自转为bool 判断用户是否不再输入
cin.fail()表示输入缓冲流的状态,当发生读到文件尾(不是只遇到回车,而是之后都不在输入)或读取失败时,会把failbit、eofbit标志置1。
cin.eof()表示遇到文件尾,eofbit置1
cin>>或cin.get返回一个istream对象,当放到需要bool条件时会自动转为bool类型,如果读取成功会转为true,如果没有成功返回false,这种更通用。while(cin.get(ch)) 就可以判断是否读完了,会一个字符一个字符的读下去。

#include<iostream>
int main() {
using namespace std;
int tmp = 0;
while(!cin.fail()) {
int sum = 0;
while(cin >> tmp) {
sum += tmp;
if(cin.get() == '\n') {
cout << sum << endl;
break;
}
}
}
return 0;
}
最后推荐一个牛客网在线io编程练习:https://ac.nowcoder.com/acm/contest/320#question,多多练习,勤能补拙,加油(ง •_•)ง。
本文介绍了在线笔试中遇到的C/C++输入数据问题,包括使用scanf、getline(cin, input)、istringstream和cin状态判断等方法。通过实例和代码示例,讲解了如何有效地处理输入数据,特别是处理未知数量的数组输入。建议通过在线IO编程练习提高处理能力。"
104573567,8095983,OpenCV-Python 图像处理:轮廓属性与形状匹配,"['计算机视觉', '图像分析', 'OpenCV-Python', '轮廓检测', '形状匹配']


被折叠的 条评论
为什么被折叠?



