问题的发现:
问题一:分割字符
将多组类似下方的数据按‘:’分割存储
1:0-0:unaccepted
1:0-1:accepted
2:0-2:unaccepted
2:0-3:accepted
2:0-4:unaccepted
3:0-5:unaccepted
4:0-6:accepted
问题二:将字符串类型转换成Int类型
将字符串类型转换成Int类型
问题一:分割字符
c语言方法,用strtok()函数分割
尚未实践
c++方法
方法一:使用getline()
使用string流,再用getline()函数分割
getline()的完整标签
std::istream& getline(std::istream& is, std::string& str, char delim);
is
: 输入流,可以是std::cin
、std::ifstream
等。str
: 用于存储读取文本的字符串。delim
: 分隔符,表示在哪个字符处停止读取。
缺点
1.只能将流中数据存储进字符串。
2.分割只能为单个字符。
个人实际示例
#include<iostream>
#include<sstream>
#include<string>
using namespace std;
int main()
{
int n,k; //n个题目,k次提交
cin>> n >> k;
string data;
string num[k];
string time[k];
string res[k];
string toke;
for(int i=0;i<k;i++)
{
cin>>data;
stringstream ss(data);
getline(ss,toke,':');
num[i] = toke;
getline(ss,toke,':');
time[i] = toke;
getline(ss,toke);
res[i] = toke;
}
for(int i=0;i<k;i++)
{
cout<<num[i]<<"\n"<<time[i]<<"\n"<<res[i]<<"\n";
}
}
结果
4 7
1:0-0:unaccepted
1:0-1:accepted
2:0-2:unaccepted
2:0-3:accepted
2:0-4:unaccepted
3:0-5:unaccepted
4:0-6:accepted
1
0-0
unaccepted
1
0-1
accepted
2
0-2
unaccepted
2
0-3
accepted
2
0-4
unaccepted
3
0-5
unaccepted
4
0-6
accepted
方法二:cin.getline()
通过结束标志,或者字符个数的限制,分割存储字符。
cin.getline()的完整形式:
cin.getlien(字符数组名,字符个数,结束标志)
cin.getline(string str,int n,char a)
问题二:将字符串类型转换成Int类型
方法一:使用流stingstream
使用stingstrea(),将字符转为流,在从流中,把数据以int的形式存入变量当中.
#include<iostream>
#include<sstream>
#include<string>
using namespace std;
int main()
{
stringstream ss("2-1");
int a,b;
char gar; //用gar将当个字符-从流中提出
ss>>a>>gar>>b;
cout<<a<<"\n"<<b<<"\n";
}
方法二:使用 stoi 函数
暂未实践
额外知识:缓冲区与流
流的概念:
类似河流一般,将数据按顺序流出流入。常见流如"istream","ostream"。
缓冲区的意义:
让设备不用一直读写,提高效率,先用缓冲区(内存中的一个区域)将数据存储,再在有需要读写的时候,将缓冲区的数据读入。
联系:
数据先写入缓冲区,流的操作在从缓冲区中提取数据到流中。(个人理解,可能有错)
参考文章:
什么是缓冲区(buffer),什么是缓存(cache)_数据缓冲区-CSDN博客
chatgpt