2011-08-13 18 views
3

配列内の一致する文字列を検索するために小さなスニペットを書いた後、並列配列の結果をきれいにフォーマットされた方法で出力します。しかし、文字列出力の仕組みに関する基本的な誤解があります。なぜなら、私の人生にとって、タブ、改行、またはコード内にendlを使用するかどうかに関係なく、正しく出力することができないからです。coutステートメントの不思議な改行

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に存在する悪魔のようなどのような癖++それは私にそんなに痛みを引き起こしているのですか?

+0

試みがあなたのブツの末尾に '<< endl'を追加し、「\ n」は、私が試した –

+0

@hexa'の末尾に<< endl'を取り除きます最初は、「cout」、それはまったくなく...何も動作していないようです! – Moses

+0

ターミナル/コマンドラインウィンドウに出力して、これを表示していますか?もしそうなら、どちらの端末プログラムを使用していますか?ファイルにリダイレクトしてそのファイルを開くとどうなりますか? – Jacob

答えて

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

最初にデータを読み込むために使用した実際のコードを修正しました。改行を文字列として読み込まないようにしました。そうすれば、問題は他のどこかに伝播しません。それにもかかわらず、私はデータの読み方を変更できなかったので、このアプローチもうまくいっていたでしょう。 – Moses

1

"MatchedString"実際に"\nMatchedString"のように愚かではないと確信していますか?そこに余分なものを印刷して空白をよりはっきりと描くことができます。

2

は(可能な答えとしての私のコメントを修正再表示する。)

標準的なアプローチ常にそれが現れる順序で終了し、他のすべての\nを置くことです。

これを破ると私が考えることができるのは、\rの2番目と3番目に一致する文字列の先頭です。 (他の誰かが正しく、二重間隔は入力の先頭に\nことを示唆していることを観察した。)

+0

サンプルテストを行い、最初の行に改行が挿入された後、何とか私の文字列を確認しました。これらの厄介な改行を取り除く方法はありますか? – Moses

+1

@Moses:彼らは最初にどのようにそこに着いたのですか? –

+0

私はテキストファイルからデータを読み込んでいます。そのため、最初のエントリを除くすべてのエントリが最初に改行を持っています。 – Moses