我发现了关于string::substr的奇怪行为。通常我在Windows 7上用Eclipse+MinGW编码,但是当我在笔记本电脑上使用Linux(Ubuntu 12.04)中的Eclipse时,我注意到结果不同。
我正在处理被填充了文本行的vector< string >。其中一步是从行中删除最后一个字符。
在win7 Eclipse中,我这样做:
或者使用另一种方法:
当在Windows上使用Linux方法时(修剪最后2个字符或替换倒数第二个字符),会出现错误。
问题似乎是myString.size()在Windows中返回的是字符数,但在Linux中返回的是字符数+1。可能是因为Linux计算了新行符?
作为C ++和编程的新手,我想知道为什么会这样,并且如何使其独立于平台。
另一个我想知道的是:哪种方法更可取(更快)substr还是replace?
编辑: 用于填充字符串s的方法是我编写的此函数:
我正在处理被填充了文本行的vector< string >。其中一步是从行中删除最后一个字符。
在win7 Eclipse中,我这样做:
for( int i = 0; i < (int)vectorOfLines.size(); i++ )
{
vectorOfTrimmedLines.push_back( ((string)vectorOfLines.at(i)).substr(0, ((string)vectorOfLines.at(i)).size()-1) );
}
并且它的作用就像预期的一样(从每行末尾删除最后一个字符)。
但是在Linux中,这段代码无法削减。相反,我需要这样做:
// -2 instead -1 character
vectorOfTrimmedLines.push_back( ((string)vectorOfLines.at(i)).substr(0, ((string)vectorOfLines.at(i)).size()-2) );
或者使用另一种方法:
vectorOfTrimmedLines.push_back( ((string)vectorOfLines.at(i)).replace( (((string)vectorOfLines.at(i)).size()-2),1,"",0 ));
当在Windows上使用Linux方法时(修剪最后2个字符或替换倒数第二个字符),会出现错误。
问题似乎是myString.size()在Windows中返回的是字符数,但在Linux中返回的是字符数+1。可能是因为Linux计算了新行符?
作为C ++和编程的新手,我想知道为什么会这样,并且如何使其独立于平台。
另一个我想知道的是:哪种方法更可取(更快)substr还是replace?
编辑: 用于填充字符串s的方法是我编写的此函数:
vector< string > ReadFile( string pathToFile )
{
// opening file
ifstream myFile;
myFile.open( pathToFile.c_str() );
// vector of strings that is returned by this function, contains file line by line
vector< string > vectorOfLines;
// check if the file is open and then read file line by line to string element of vector
if( myFile.is_open() )
{
string line; // this will contain the data read from current the file
while( getline( myFile, line ) ) // until last line in file
{
vectorOfLines.push_back( line ); // add current line to new string element in vector
}
myFile.close(); // close the file
}
// if file does not exist
else
{
cerr << "Unable to open file." << endl; // if the file is not open output
//throw;
}
return vectorOfLines; // return vector of lines from file
}
at
而不是[]
运算符?为什么循环中不使用迭代器?最后,您确定Linux和Windows中的字符串实际上是相同的吗? - Some programmer dude