【问题标题】:Unexpected cout << from a string * when adding a comma添加逗号时字符串 * 的意外 cout <<
【发布时间】:2012-02-13 17:56:14
【问题描述】:

在之前使用 Visual Studio 后,我在迁移到 RedHat 上的 g++ 编译时遇到了一个有趣的错误。

我有一个看起来像这样的循环:

for(unsigned int i = 0; i < data.size(); i ++){

    for(int j = 0; j < data[i]->size; j++){

        cout << data[i]->columns[j]<< ',';
    }

    cout << endl;

}

其中 data[i]->columns 是字符串 *,目的是用逗号分隔输出。 以前,这很有效,但是,今天我的输出看起来像这样:

,ata, two, three, four
,ata2, two, three, four
,ata3, two, three, four

如果我将代码稍微更改为: cout columns[j]

我明白了:

data
two
three
four

data2
two
three
four

什么可能导致这些字符与逗号重叠?这在 Visual Studio 编译器上没有发生。

【问题讨论】:

  • 请复制粘贴(not 重新输入)实际 代码来演示错误。您发布的代码 sn-p 不太可能编译。 sscce.org.

标签: c++ string cout


【解决方案1】:

看起来每一行的最后一个条目都有一个 \r 和/或 \n。

所以你得到了四个"fourBREAK,"

您的 endl 输出似乎证实了这一点,因为您在四点后得到了 2 个换行符。

【讨论】:

  • 更具体地说是回车符('\r')
  • 看起来这是正确的,将最后一个字符设置为 null 解决了这个问题。 To rve-回车到底是什么,是什么导致它出现?我正在使用 '\n' 作为一行字符串的分隔符来解析数据,并认为它不会在字符串本身中包含 '\n'。
  • @Glem Windows 使用 \r\n 来表示 Unix 仅使用 \n 的新行。 \r 是回车(到行首),而 \n 是新行。把它想象成打字机。首先,您必须将栏移回开头,然后您必须添加一个新行。
  • 啊,那是有道理的。谢谢!
【解决方案2】:

您的输入文件(您在填充 data 时读取的文件)是 MS-DOS 文本格式。要么使用dos2unix 或类似的实用程序,要么在输入时忽略\r

【讨论】:

    猜你喜欢
    • 2017-09-13
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 2023-02-01
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 2022-08-11
    相关资源
    最近更新 更多