练习网址:牛客网OJ在线编程常见输入输出练习场
输入包括两个正整数a, b(1 <= a, b <= 10 ^ 9), 输入数据包括多组。
输出a + b的结果
输入:
1 5
10 20
输出:
6
30
int main() {
int a, b;
while (cin >> a >> b) {
cout << a + b << endl;
}
return 0;
}
输入第一行包括一个数据组数t(1 <= t <= 100)
接下来每行包括两个正整数a, b(1 <= a, b <= 10 ^ 9)
输出a + b的结果
输入:
2
1 5
10 20
输出:
6
30
int main() {
int t;
cin >> t;
int a, b;
for (int i = 0; i < t; i++) {
cin >> a >> b;
cout << a + b << endl;
}
return 0;
}
输入包括两个正整数a,b(1 <= a, b <= 10^9),输入数据有多组, 如果输入为0 0则结束输入
输出a+b的结果
输入:
1 5
10 20
0 0
输出:
6
30
int main() {
int a, b;
while (cin >> a >> b) {
//输入数据为指定值时,终止输入
if (a == 0 && b == 0) break;
cout << a + b << endl;
}
return 0;
}
输入数据包括多组。
每组数据一行,每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数,即需要求和的每个正整数。
每组数据输出求和的结果
输入:
4 1 2 3 4
5 1 2 3 4 5
输出:
10
15
int main() {
int n;
vector<int> vec;
while (cin >> n) {
int num;
for (int i = 0; i < n; i++) {
cin >> num;
vec.push_back(num);
}
int sum = 0;
for (int i = 0; i < vec.size(); i++) {
sum += vec[i];
}
cout << sum << endl;
vec.clear();
}
return 0;
}
输入的第一行包括一个正整数t(1 <= t <= 100), 表示数据组数。
接下来t行, 每行一组数据。
每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数, 即需要求和的每个正整数。
每组数据输出求和的结果
输入:
2
4 1 2 3 4
5 1 2 3 4 5
输出:
10
15
int main() {
int t;
int n;
vector<int> vec;
cin >> t;
for (int i = 0; i < t; i++) {
while (cin >> n) {
int num;
for (int i = 0; i < n; i++) {
cin >> num;
vec.push_back(num);
}
int sum = 0;
for (int i = 0; i < vec.size(); i++) {
sum += vec[i];
}
cout << sum << endl;
vec.clear();
}
}
return 0;
}
输入数据包括多组。
每组数据一行,每行的第一个整数为整数的个数n(1 <= n <= 100), n为0的时候结束输入。
接下来n个正整数,即需要求和的每个正整数。
每组数据输出求和的结果
输入:
4 1 2 3 4
5 1 2 3 4 5
0
输出:
10
15
方法1:无参构造初始化vector
int main() {
int n;
vector<int> vec;
while (cin >> n) {
//每行第1个输入数据为指定值时,终止输入
if (n == 0) break;
int num;
for (int i = 0; i < n; i++) {
cin >> num;
vec.push_back(num);
}
int sum = 0;
for (int i = 0; i < vec.size(); i++) {
sum += vec[i];
}
cout << sum << endl;
vec.clear();
}
return 0;
}
方法2:有参构造初始化vector
int main() {
int n;
while (cin >> n) {
if (n == 0) break;
vector<int> vec(n, 0);
for (int i = 0; i < n; i++) {
cin >> vec[i];
}
int sum = 0;
for (int i = 0; i < vec.size(); i++) {
sum += vec[i];
}
cout << sum << endl;
vec.clear();
}
return 0;
}
注:部分方法参考文章在线笔试C/C++攻克输入数据问题。
输入数据有多组, 每行表示一组输入数据。
每行不定有n个整数,空格隔开。(1 <= n <= 100)。
每组数据输出求和的结果
输入:
1 2 3
4 5
0 0 0 0 0
输出:
6
9
0
(1)方法1:使用cin.get() == '\n'
,将回车作为结束符。
注:
cin.get() == '\n'
等价于getchar() == '\n'
。
#include
using namespace std;
#include
int main() {
vector<int> vec;
int num;
while (cin >> num) {
int sum = 0;
vec.push_back(num);
//每行数据的末尾:当前键盘输入为换行符时
if (cin.get() == '\n') {
for (int i = 0; i < vec.size(); i++) {
sum += vec[i];
}
cout << sum << endl;
vec.clear();
}
}
return 0;
}
(2)方法2:使用C语言的scanf("%d", &num) != EOF
,循环读取每行的数据。
#include
int main()
{
int num,sum;
sum = 0;
while (scanf("%d", &num) != EOF) {
sum = sum + num;
if (getchar() == '\n') {
printf("%d\n", sum);
sum = 0 ;
}
}
return 0;
}
(3)方法3:使用字符串流stringstream
和getline(cin , line)
。
注1:字符串流的类库
定义
stringstream
、ostringstream
和stringstream
,分别实现C++风格字符串流的输入、输出、输入及输出的操作。
注2:getline
函数可读取整行,包括前导和嵌入的空格,并将其存储在字符串对象中。
#include
#include
using namespace std;
int main()
{
string line;
while (getline(cin, line))
{
stringstream linestream(line);
int x;
int sum = 0;
while (linestream >> x)
{
sum += x;
}
cout << sum << endl;
}
}
方法:动态数组的嵌套,使用cin.get() == '\n'
判断每行的结束位置;使用cin.peek() == '\n'
判断输入是否结束。
输入效果:
①最后一个元素后使用空格时,只需按一次回车,即可结束键盘输入,输入缓冲区正常(不会多空一行)。
②最后一个元素后不使用空格时,需按两次回车,才能结束键盘输入,输入缓冲区会多空一行。
#include
using namespace std;
#include
int main() {
vector<vector<int>> outer; //二维数组
vector<int> inner; //一维数组
int num;
while (cin >> num) {
inner.push_back(num);
//每行数据的末尾:当前键盘输入为换行符时
if (cin.get() == '\n') {
//将内层的一维数组inner,插入外层的二维数组中
outer.push_back(inner);
inner.clear();
}
//peek():从输入缓冲区观测并返回1个字符,不从输入缓冲区取走字符。
if (cin.peek() == '\n') {
outer.push_back(inner);
break;
}
}
cout << "----迭代器遍历----" << endl;
//遍历二维数组:迭代器
for (vector<vector<int>>::iterator uit = outer.begin(); uit != outer.end(); uit++) {
for (vector<int>::iterator it = (*uit).begin(); it != (*uit).end(); it++) {
cout << *it << " ";
}
cout << endl;
}
return 0;
}
输入有两行,第一行n
第二行是n个空格隔开的字符串
输出一行排序后的字符串,空格隔开,无结尾空格
输入:
5
c d a bb e
输出:
a bb c d e
#include
using namespace std;
#include
#include
#include
void printVector(const vector<string> &vec){
for(int i = 0; i < vec.size(); i++){
if(i != vec.size() - 1){
cout << vec[i] << " ";
}else{
cout << vec[i] << endl;
}
}
}
int main() {
int n;
string str;
vector<string> vec;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> str;
vec.push_back(str);
}
sort(vec.begin(), vec.end());
printVector(vec);
return 0;
}
多个测试用例,每个测试用例一行。
每行通过空格隔开,有n个字符,n<100
对于每组测试用例,输出一行排序过的字符串,每个字符串通过空格隔开
输入:
a c bb
f dddd
nowcoder
输出:
a bb c
dddd f
nowcoder
#include
using namespace std;
#include
#include
#include
void printVector(const vector<string> &vec){
for(int i = 0; i < vec.size(); i++){
if(i != vec.size() - 1){
cout << vec[i] << " ";
}else{
cout << vec[i] << endl;
}
}
}
int main(){
int n;
string str;
vector<string> vec;
while(cin >> str){
vec.push_back(str);
//每行数据的末尾:当前键盘输入为换行符时
if(cin.get() == '\n'){
sort(vec.begin(), vec.end());
printVector(vec);
vec.clear();
}
}
return 0;
}
多个测试用例,每个测试用例一行。
每行通过逗号,隔开,有n个字符,n<100
对于每组用例输出一行排序后的字符串,用逗号’,'隔开,无结尾空格。
输入:
a,c,bb
f,dddd
nowcoder
输出:
a,bb,c
dddd,f
nowcoder
(1)解法1:
使用istream标准输入流对象cin
和getline(cin , line)
函数,从键盘输入接收一整行数据。
使用stringstream字符串流对象
和getline(ss, temp , ch)
函数,根据指定字符分割字符串。
#include
using namespace std;
#include
#include
#include
#include
void printVector(const vector<string> &vec){
for(int i = 0; i < vec.size(); i++){
if(i != vec.size() - 1){
cout << vec[i] << ",";
}else{
cout << vec[i] << endl;
}
}
}
int main(){
int n;
string line; //一整行字符串
string temp; //被分割的字符串
vector<string> vec;
//每次读取一整行
while(getline(cin, line)){
//创建字符串流stringstream对象
stringstream ss(line);
//根据指定字符分割字符串
while(getline(ss, temp, ',')){
vec.push_back(temp);
}
sort(vec.begin(), vec.end());
printVector(vec);
vec.clear();
}
return 0;
}
(2)解法2:使用字符串的find()
和substr()
函数,逐个分割字符串。
#include
using namespace std;
#include
#include
#include
void SplitString(const string& s, vector<string>& v, const string& t)
{
string::size_type pos1, pos2;
pos2 = s.find(t);
pos1 = 0;
while (pos2 != string::npos)
{
v.push_back(s.substr(pos1, pos2 - pos1));
pos1 = pos2 + t.size();
pos2 = s.find(t, pos1);
}
if (pos1 != s.length()) {
v.push_back(s.substr(pos1));
}
}
void printVector(const vector<string> &vec){
for(int i = 0; i < vec.size(); i++){
if(i != vec.size() - 1){
cout << vec[i] << ",";
}else{
cout << vec[i] << endl;
}
}
}
int main(){
int n;
string line; //一整行字符串
string temp; //被分割的字符串
vector<string> vec;
//每次读取一整行
while(getline(cin, line)){
SplitString(line, vec, ",");
sort(vec.begin(), vec.end());
printVector(vec);
vec.clear();
}
return 0;
}
参考1:C++ 使用 stringstream与getline()分割字符串
参考2:C++中String类的字符串分割实现
(1)使用stringstream字符串流对象
和getline(ss, temp , ch)
函数,根据指定字符分割字符串。
vector<string> splitStr(string str, char del) {
stringstream ss(str);
string temp;
vector<string> ret;
while (getline(ss, temp, del)) {
ret.push_back(temp);
}
return ret;
}
(2)使用字符串的find()
和substr()
函数,逐个分割字符串。
//源字符串s;目标字符串t
//场景示例:IP地址:192.168.66.88
vector<string> splitStr(const string& s, const string& t) {
//存储分割后的字符串
vector<string> res;
string::size_type pos1, pos2;
pos2 = s.find(t);
pos1 = 0;
while (pos2 != string::npos)
{
res.push_back(s.substr(pos1, pos2 - pos1));
pos1 = pos2 + t.size();
pos2 = s.find(t, pos1);
}
if (pos1 != s.length()) {
res.push_back(s.substr(pos1));
}
return res;
}