0

できるだけ少ないコードを書くループなしでそうする方法はありますか:

for (int i = 0; i < 10; i++) std::cout << 'x';

Pythonのように:

print 'x' * 10
4

5 に答える 5

7

std::string(size_t, char)コンストラクターを使用します。

std::cout << std::string(10, 'x');

Python とは異なり、これは char でのみ機能し、文字列では機能しないことに注意してください。

于 2013-02-13T18:07:29.170 に答える
3
void print(const char *s, int n)
{
   if (n > 0) 
   {
      cout << s;
      print(s, n - 1);
   }
}

トリックを行う必要があります。

于 2013-02-13T18:12:38.097 に答える
1
std::generate_n(
    std::ostream_iterator<char>(std::cout, ""),
    10,
    [](){ return 'x'; }
);
于 2013-02-13T19:13:51.977 に答える
1

最も拡張可能/再利用可能な方法は、上記の Ed に似た関数を作成することですが、stringstream を使用し、関数を印刷と結合しません。

IMO、NPEの回答は、1文字のみにすることを強制することで制限が厳しすぎます.Edの回答は、C ++の回答よりもCの回答です。副次的な利点として、この関数を使用すると、文字、整数、文字列などをストリーミングすることもできます。

template <class T>
std::string multiplyString(int count, const T &input)
{
    std::stringstream ss;
    for(int i = 0; i < count; i++)
       ss << T;
    return ss.str();
}

int main(argc, char *argv[])
{
    std::cout << multiplyString(10, 'x') << std::endl;
    std::cout << multiplyString(5, "xx") << std::endl;
    std::cout << multiplyString(5, 1234) << std::endl;
}

幸運を祈ります

于 2013-02-13T18:20:53.710 に答える
0

他に誰も合理的な実装を提供していないため:

std::string
multiplyStrings( int count, std::string const& original )
{
    std::string results;
    results.reserve( count * original.size() );  //  Just optimization
    while ( count > 0 ) {
        results += original;
    }
    return results;
}

これからのオーバーロードを作成するoperator*ことは難しくありません。名前空間 std でそれらを定義することは未定義の動作になりますが、私見では、とにかくそれを回避できる可能性はかなり高いです。

于 2013-02-13T19:17:34.320 に答える