【问题标题】:Vectors in C++ are behaving differently in Windows and UbuntuC++ 中的向量在 Windows 和 Ubuntu 中的行为不同
【发布时间】:2013-09-05 10:41:57
【问题描述】:

我必须比较存储在向量中的两个字符串。比较在使用 mingw-g++ 编译器(版本 4.4.1)的 Windows 中运行良好。

但是当我尝试在运行 g++ 版本 4.7.2 的 Ubuntu 中做同样的事情时,我遇到了奇怪的问题。我在下面列出了它们:

  1. 当我尝试单独打印元素时,它们给出了正确的输出并且两个字符串相同。

  2. 但是当我尝试使用 == 运算符或 strcmp() 比较它们时,即使它们相同,它们也不相等。

  3. 当我尝试打印上面比较的元素时,某个字符串正在替换第一个字符串的值。代码如下。理想情况下,不应该执行 if 循环,但它仍在执行并打印一些垃圾值而不是 v1[i]。

vector<string> v1 = r1->GetSchema().GetAttrTypes();
vector<string> v2 = r2->GetSchema().GetAttrTypes();
for(i=0; i<v2.size();i++)
    if(v1[i] != v2[i])
        cout << v1[i] << " " << v2[i] << " awdsd" << endl;

我不知道如何搜索这类错误。我从同一个文件中获取字符串并存储在 Windows 和 Ubuntu 中的向量中。

编辑:我在这里附上部分代码。右侧的函数返回字符串向量。我不能粘贴上面类的代码,因为它是非常大的代码。

【问题讨论】:

  • 你可能有一些未定义的行为。能否展示v 的声明,以及如何填充它的元素?
  • 您是否启用了 GCC 的所有警告和调试信息(即g++ -Wall -g)?您是否更正了代码,直到没有给出警告?你使用了gdb 调试器吗?
  • WIndows v. linux 字符串差异通常是由于 SSO v COW。填充向量的代码可能有问题,您还没有完整地展示它。
  • Linux 上的字符串可能确实不同。这意味着实际生成字符串的代码有问题并在 Linux 上产生错误的结果。但这当然只是一个理论。
  • 然后,更正您的代码,直到使用g++ -Wall -Wextra -g 给出警告为止,然后使用gdb 运行您的代码进行调试...

标签: c++ string vector g++ g++-4.7


【解决方案1】:

问题出在:

r1->GetSchema().GetAttrTypes();

这个函数一定是在搞砸std::string 的创建方式。 可以给我们看看代码吗?

【讨论】:

    【解决方案2】:

    嗯,一切都很好,除了我正在读取输入字符串的文件。由于我在 Windows 上创建了该文件,因此它的行尾不同(\r\n),而在 Ubuntu 中它是(\n)。

    在 Ubuntu 中,我必须转换正在读取的文本文件输入 Unix 模式。 之后一切都很好。

    我不知道我怎么错过了这个小点。

    感谢您的意见。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-22
    • 2012-12-04
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多