在使用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提供的仿函数
}