牛客网 构造输入输出数据 ACM模式

本文详细介绍了ACM模式下C++编程中如何有效构造输入,包括数字、字符串的处理,以及混合类型的输入。重点讲解了while(cin)的使用技巧,如何处理单个数字、数组、字符串组的输入,并提供了字符串操作如分割、转换示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

包含了c++所有的头文件
#include<bits/stlc++.h>

经历第一次笔试之后,发现对于ACM模式的笔试不是很清楚,在输入输出的构造上浪费很多时间,特查阅资料以及自己总结以下各种构造输入要求的方法

while(cin) 说明

int val;
while(cin<<val){
	std::cout<<val<<std::endl;
}

运算符返回的是流对象的引用,cin是一个流对象,而**>>运算符返回左边的流对象**,也就是说cin>>val返回cin,于是while(cin>>val)就变成了while(cin),问题就变成了一个流对象在判断语句中的合法性。

输入类型可分为数字、字符串、混合型

数字

(1)输入一个数,对该数字进行一些操作

例如判断是否是素数,立方根等

int val;
while(cin<<val){   // 使用while不容易出错
	std::cout<<val<<std::endl;
}

(2) 输入一组数,对该组数字进行操作

~scanf("%lld",&n)
#include<bits/stdc++.h>
using namespace std;

long long n;
long long solve[5];
int main()
{
    while(cin>>n)// ~scanf("%lld",&n)
    {
        for(int i=0; i<5; ++i)
        {
            cin>>solve[i];//scanf("%lld",&solve[i] );
        }
        long long sum=0;
        
        for(int i=0; i<5; ++i)
        {
            if( solve[i]<n )
            {
                sum+=solve[i];
            }
        }
        printf("%lld\n",sum);
    }

    return 0;
}

(3) 输入一个数,表示有多少组数

字符串

(1)输入一个字符串,对该字符串进行一些操作

string number;
while(cin<<number){   // 使用while不容易出错
	std::cout<<number<<std::endl;
}

字符串知识附加

字符串的操作

// 1. 分割字符串
void substr()// 需要自己实现
// 2. 字符串string转int
void atoi()
// 3. int转字符串string
void to_string() 

以下按照空格去分割字符串

#include <iostream>
#include <string>
#include <sstream>
#include <iterator>
#include <vector>
#include <algorithm>

using std::cout; using std::cin;
using std::endl; using std::string;
using std::vector; using std::istringstream;
using std::stringstream;

int main(){

    string text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
                  "Sed laoreet sem leo, in posuere orci elementum."; 
    string space_delimiter = " "; // 分割依据
    vector<string> words{};

    size_t pos = 0; // 寻找分割点
    while ((pos = text.find(space_delimiter)) != string::npos) { 
    // pos = text.find(space_delimiter) 在text中寻找space_delimiter的第一个出现位置 用pose记录
    // string::npos静态成员常量:是对类型为size_t的元素具有最大可能的值。当这个值在字符串成员函数中的长度或者子长度被使用时,该值表示“直到字符串结尾”。作为返回值他通常被用作表明没有匹配。
        words.push_back(text.substr(0, pos)); // 保存
        text.erase(0, pos + space_delimiter.length()); // 去除 接着分割
    }
    for (const auto &str : words) {
        cout << str << endl;
    }

    return EXIT_SUCCESS;  // return 0
}

(2)输入一个数表示有多少个字符串,再输入每个字符串

int N,T;//定义数量N, 测试数据量T
string temp;//字符串变量
cin>>T;
while(T--){
	while(cin>>N){  //输入数量
    	vector<string> input; //存储所有的字符串
    	for(int i=0;i<N;i++){
        	cin>>temp; //输入字符串
        	input.push_back(temp);//保存
    	}
	}
}

(3) 输入一组字符串,不告知大小

不知道怎么停止


int T; //测试数据组数T
string temp;//字符串变量
cin>>T;
while(T--){
	vector<string> input; //存储所有的字符串
	while(cin>>temp){ //输入数量
    	input.push_back(temp);//保存
    	//...
    }
}

使用getline

char str[BUFFER];
while (cin.getline(str, BUFFER)) {
}
string str;
while (getline(cin, str)) {
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值