比较字符串在mingw和ubuntu gcc上的行为不同

时间:2015-03-24 04:35:14

标签: c++ windows string ubuntu

我想比较两个字符串。这是我的代码。

string line;
getline(cin, line);
if(line.compare("% Input alphabet")==0)
dosomething;

问题是以下代码在Windows机器上使用mingw时正常工作,但是当我在我的ubuntu vm上运行相同的代码时,它不执行dosomething方法。我编译了我的程序并运行了以下命令

在Windows上

  

a.exe< input.txt中

在Ubuntu上

  

./ a.out< input.txt

2 个答案:

答案 0 :(得分:2)

我建议最后修剪\r\n个符号。这是Window(\ r \ n)和Unix(\ n)之间的唯一区别。

使用boost::trim()执行此操作

答案 1 :(得分:0)

您使用的是在Windows上创建的完全相同的input.txt文件,然后传输到Linux计算机吗?如果是,那么这可能会导致您描述的问题。

这个想法是C ++流基于平台不同地处理行结束字符(如果你不打开二进制模式的流)。这行代码:

someTextFileStream << "some text\n";

如果在Windows上运行,实际上会在行末写入\r\n,如果在Linux上运行则只会写\n。 从文本流中读取时也是如此,在Windows上\r\n将被解释为单个新行字符/分隔符,仅在Linux上\n将被解释为新行字符。

现在,如果您在Windows上创建一个文本文件(例如,使用记事本),它将如下所示:

some text written on Windows\r\n

如果您在Windows上使用getline()来阅读此内容,则getline()填充的字符串将包含some text written on Windows

如果您在Linux上传输此文件(因此它与Windows文件的二进制文件完全相同),然后再次使用getline()读取该文件,则该字符串实际上将包含some text written on Windows\r。这是因为在Linux上,新的行分隔符为\n,因此getline()会停止。

可能的解决方案:从文件中读取后修剪线条;检测行结束分隔符并在代码中适当地转换/处理它;在创建文件时,代码运行的平台使用正确的行结尾。