在cout声明中神秘的断线

时间:2011-08-13 04:16:56

标签: c++

我写了一个小片段来搜索数组中匹配的字符串,然后以格式良好的方式输出并行数组的结果。但是,我必须对字符串输出如何工作有一些基本的误解,因为对于我的生活,我无法正确输出,无论我在哪里放置标签,换行符,或者我是否使用endl我的代码。

以下是相关代码:

for (int i = 0; i < arrayCount; i++) {
    if (arrayCopy[i].find(localString) != string::npos) {
        cout << "\n\t"
        << array1[i] << " {"
        << subArray1[i] << ", "
        << subArray2[i] << "}";
    }
}

我希望结果在每一行的开头都有一个标签:

         MatchedString1 {Data, MoreData}
         MatchedString2 {Data, MoreData}
         MatchedString3 {Data, MoreData}

相反,我得到的结果如下所示,标签显示在空行上(第一个结果除外):

         MatchedString1 {Data, MoreData}

MatchedString2 {Data, MoreData}

MatchedString3 {Data, MoreData}

c ++中存在什么恶魔般的怪癖会让我如此痛苦?!

3 个答案:

答案 0 :(得分:3)

使用以下来源重新创建您的问题:

$ cat test.cpp 
#include <iostream>
#include <string>

int main() {
    using std::cout;
    using std::string;

    const std::string array1[] = {"MatchedString1", "MatchedString2", "MatchedString3"};
    const std::string arrayCopy[] = {"MatchedString1", "MatchedString2", "MatchedString3"}; 
    const std::string localString = "String";
    const std::string subArray1[] = {"Data", "Data", "Data"};
    const std::string subArray2[] = {"More data", "More data", "more data"};
    const unsigned int arrayCount = 3;

    for (int i = 0; i < arrayCount; i++) {
        if (arrayCopy[i].find(localString) != string::npos) {
            cout << "\n\t"
                << array1[i] << " {"
                << subArray1[i] << ", "
                << subArray2[i] << "}";
        }
    }
}

编译并运行:

$ g++ test.cpp 
$ ./a.out

        MatchedString1 {Data, More data}
        MatchedString2 {Data, More data}
        MatchedString3 {Data, more data}

<强>结论

额外的换行符在您的数据中。

建议

使用方括号来描绘您的输入:

std::cout << "[" << array1[i] << "] {[" << subArray1[i] << "], [" << subArray2[i] << "]}" <<  std::endl;

剥离字符串

如果您发现需要删除字符串,则可能会发现以下功能有用:

std::string lstrip(const std::string& s, const char* chars = " \t\r\n")
{
    std::string::size_type begin = s.find_first_not_of(chars);
    if (begin == std::string::npos)
    {
        return "";
    }
    return std::string(s, begin);
}

std::string rstrip(const std::string& s, const char* chars = " \t\r\n")
{
    std::string::size_type end = s.find_last_not_of(chars);
    return std::string(s, 0, end + 1);
}

std::string strip(const std::string& s)
{
    return lstrip(rstrip(s));
}

像这样使用:

        std::cout << "\t"
            << strip(array1[i]) << " {"
            << strip(subArray1[i]) << ", "
            << strip(subArray2[i]) << "}"
            << std::endl;

答案 1 :(得分:2)

(重申我的评论作为可能的答案。)

标准方法是始终将\n放在最后,其他所有内容都按其出现的顺序排列。

我唯一可以想到的就是在第二个和第三个匹配的字符串的开头是\r。 (其他人正确地观察到,在输入的开头,双倍间距表示\n。)

答案 2 :(得分:1)

你确定这不仅仅是"MatchedString"实际上是"\nMatchedString"的傻事吗?您可以尝试在那里打印一些额外的东西来更清楚地描绘您的空白。

相关问题