簡體   English   中英

cout 語句中的神秘換行符

[英]Mysterious line break in cout statement

我編寫了一個小片段來搜索數組中匹配的字符串,然后以格式精美的方式為並行 arrays 生成 output 結果。 但是,我必須對字符串輸出的工作方式有一些基本的誤解,因為在我的一生中,無論我將制表符、換行符放在哪里,或者是否在代碼中使用endl ,我都無法正確地將其傳遞給 output。

下面是相關代碼:

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++ 中存在什么讓我如此痛苦的怪癖?!

使用以下來源重現您的問題:

$ 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;

(重申我的評論作為可能的答案。)

標准方法是始終將\n放在末尾,其他所有內容都按其出現的順序放置。

我能想到的唯一會破壞它的是第二個和第三個匹配字符串開頭的\r (其他人正確地觀察到雙倍行距暗示輸入開頭的\n 。)

你確定這不僅僅是像"MatchedString"實際上是"\nMatchedString"的傻事嗎? 你可以嘗試在那里打印一些額外的東西來更清楚地描繪你的空白。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM