C++ 处理OJ的输入

本文记录了在使用在线评测系统(如牛客)时遇到的C++处理输入输出的常见问题,包括如何从逗号分隔的输入获取数组,避免scanf与C++的混用,以及C++中数字与字符串转换和sort函数的自定义比较方法。

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

在使用OJ(比如牛客)码代码的时候,经常碰上处理输入输出的问题,以下记录一下自己遇到的坑

1. 从输入获取一个数组,但是这个数组适用逗号(或者其他乱七八糟的,反正不是空格)

    通常出现在不给定数组长度,需要自己循环获取数组时

// 假设从屏幕获取一个以逗号分隔的数组 如5,3,4,1,1 但是数组长度没有给定

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

int main()
{
    vector<int> input;       // 数组长度不固定,用vector处理
    /* 获取输入 */
    string inputStr;         // 首先接收为字符串
    cin>>inputStr;
    int pos=inputStr.find(',');
    while(string::npos != pos)
    {
        inputStr.replace(pos,1,1,' ');
        pos=inputStr.find(',');
    }                        // 将字符串中所有的逗号替换为空格
    stringstream ss;
    ss<<inputStr;            // 将处理后的字符串写入字符流, 现在是一个用空格分隔的输入
                             // 现在输入可以看作5 3 4 1 1
    int tmp=0;
    while(ss>>tmp)
    {
        input.push_back(tmp);
    }                        // 从字符流获取输入,与cin类似,遇到结尾时会推出循环
}

2 关于使用scanf获取输入到string

      尽量不要将c++与c混用,scanf就是一个坑。一般scanf的效率都会比cin高,所有一般推荐使用scanf,但是scanf不能处理string类型.scanf接收char*指针,而string是一个类型。但是可以使用printf()输出!!!

// 一个关于scanf()获取字符串的测试
// 以下两种方式都行不通

// 检验使用scanf获取字符串
void getString()
{
	string str;
	//scanf("%s", str.c_str());// 输入Hello,world!
                               // 输出 0,0,Hello,World! 
                               // 正确获取到字符串内容,但是长度为0

	//scanf("%s", &str[0]);    // 现象同上

	printf("length-%d   size-%d   %s", str.length(), str.size(), str.c_str());	
} 

补充一些常见的问题:

1.C++中实现数字与字符串的转换,C语言中常用itoa和atoi等函数,C++常用stringstream.

#include <string>
#include <sstream>

using namespace std;


/* 以下实现将int转为string               */
/* 利用字符流stringstream类实现          */
/* 该方法也使用与其他数制和类型之间的转换  */
int main()
{
    int x=130;
    string str;
    stringstream ss;
    ss<<x;
    ss>>str;
    return 0;
}

2.sort()函数的自定义比较函数

/* cmp必须是全局函数或者静态函数              */
/* leetcode上通常在Solution类中定义为静态函数 */
/* 以下为简单伪码,实际使用可以定义成模板函数   */

bool cmp(参与比较的第一个参数, 参与比较的第二个参数)
{
    比较规则
    return true/false; // 返回true,则参与比较的第一个参数排在前
                       // 返回false,则参与比较的第二个参数排在前
                       // 因此可以根据需要自定义升序降序
                       // 也可以尝试STL提供的仿函数
}

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值