1

私の質問はこれに似ていますが、これにはライブラリを使用したくありません。

出力したい名前の配列があると想像してください。

string names[] = { "Peter", "Max", "Jack", "Daniel", "Luke" };

for(int i = 0; i < sizeof(names); i++)
{
    cout << names[i];
}

出力:PeterMaxJackDanielLuke

これはユーザーフレンドリーとは言えませんので、名前の間にコンマを出力しましょう。

for(int i = 0; i < sizeof(names); i++)
{
    cout << names[i] << ", ";
}

出力:Peter, Max, Jack, Daniel, Luke,

問題は最後のコンマです。ifそれが最後の要素であるかどうかのすべてのループをチェックできましたが、これforはきれいな解決策ではないようです。

ライブラリを使用せずに要素間にカンマを挿入する最良の方法は何ですか?

4

4 に答える 4

5

まず第一に、コードにバグがありsizeof(names)、間違った値を生成します。

適切な場所にコンマを配置するための従来の方法は次のとおりです。

string names[] = { "Peter", "Max", "Jack", "Daniel", "Luke" };
bool first = true;

for(auto const& name : names) {
    if (first)
        first = false;
    else
        cout << ", ";
    cout << name;
}

または、C ++ 11を使用していない場合:

for (unsigned i = 0; i < sizeof(names) / sizeof(names[0]); ++i) {
    if (i > 0)
        cout << ", ";
    cout << names[i];
}

でも、これ:

ライブラリを使用せずに要素間にコンマを挿入する最良の方法は何ですか?

間違った態度です。C ++は、ライブラリを使用する場合にのみ特にうまく機能します。ライブラリがなければ、C++は悪い言語です。または、Stroustrupの言葉で:

優れたライブラリがないと、C++で最も興味深いタスクを実行するのは困難です。しかし、優れたライブラリがあれば、ほとんどすべてのタスクを簡単に行うことができます。

于 2012-06-16T13:20:47.903 に答える
4

使用boost::join:

std::cout << boost::join(names, ", ") << "\n";

関数を書き直す意味がないからです...確かに十分に単純ですが。

于 2012-06-16T16:15:06.180 に答える
2

なぜ単純ではないのですか?

string names[] = { "Peter", "Max", "Jack", "Daniel", "Luke" };
int i;

for (i = 0; i < sizeof(names) / sizeof(names[0]) - 1; i++)
{
    cout << names[i] << ", "; 
}   
cout << names[i];

それが私が普段していることです。

于 2012-06-16T13:35:51.220 に答える
1

これはクリーンなソリューションではありませんが、唯一のソリューションです。

for(int i = 0; i < sizeof(names); i++)
{
    cout << names[i] << (i==sizeof(names)-1)?"",", ";
}
于 2012-06-16T13:21:22.127 に答える