字符串在windows和linux中的表示分别为...CR LF和...LF,所以编写程序时为了实现跨平台,需要在代码中明确过滤掉字符串中的CR(回车/r)字符。因为Linux系统只处理LF(换行/n)字符,而将CR字符识别为字符串的一部分。
下面两个程序用于将字符串以“,”分离成18个子字符串,都可以实现跨平台:
/我自己的//
void split(string in, const char separater, vector<string> &vec) //以" "为分隔符
{
int pos=in.find_first_of(separater);
while(pos!=string::npos&&vec.size()<18)
{
if(pos!=0)
vec.push_back(in.substr(0,pos));
else
vec.push_back("");
in=in.substr(pos+1,in.size()-pos-1);
pos=in.find_first_of(separater);
}
//由于windows系统和linux系统行末标识符不一,windows为CR LF (/r/n),linux为LF (/n)
if(in.at(in.size()-1)!='/r')
vec.push_back(in.substr(0,in.size()));
else
vec.push_back(in.substr(0,in.size()-1));
}
//别人的//
int str_Split(const string& a_Str, vector<string>& a_Elements, const char a_Regex)
{
string::size_type prev_pos = 0, pos = 0;
a_Elements.clear();
while ((pos = a_Str.find_first_of(a_Regex, pos)) != string::npos)
{
string element = a_Str.substr(prev_pos, pos - prev_pos);
prev_pos = ++pos;
if (a_Elements.size() == 17)
{
pos = string::npos;
break;
}
}
string element = a_Str.substr(prev_pos, pos - prev_pos);//此处的pos=npos,考虑npos指向字符串的什么位置?
return a_Elements.size();
}