先頭へ戻る

文字列 解答ページ | Programming Place Plus C++編【言語解説】 第4章

Programming Place Plus トップページ -- C++編

先頭へ戻る

問題①

問題① 次のプログラムを、std::string を使って書き換えてください。

#include <cstring>
#include <iostream>

namespace {
    void func(const char* s, std::size_t size)
    {
        if (size > 0) {
            std::cout << s << " " << size << std::endl;
        }
        else {
            std::cout << "empty" << std::endl;
        }
    }
}

int main()
{
    char s1[10] = "abcde";
    char s2[10] = "";

    func(s1, std::strlen(s1));
    func(s2, std::strlen(s2));

    std::strcpy(s2, "abcde");
    func(s2, std::strlen(s2));

    if (std::strcmp(s1, s2) == 0) {
        std::cout << "OK" << std::endl;
    }
}

まず、書き換えた結果から。

#include <iostream>
#include <string>

namespace {
    void func(const std::string* s)
    {
        if (s->empty()) {
            std::cout << "empty" << std::endl;
        }
        else {
            std::cout << *s << " " << s->size() << std::endl;
        }
    }
}

int main()
{
    std::string s1("abcde");
    std::string s2;

    func(&s1);
    func(&s2);

    s2 = "abcde";
    func(&s2);

    if (s1 == s2) {
        std::cout << "OK" << std::endl;
    }
}

実行結果:

abcde 5
empty
abcde 5
OK

変数s1 の定義時に "abcde" を与えています。変数s2 の方は空文字列で初期化されます。

代入は代入演算子で、比較は等価演算子で普通に行えます。

func関数の仮引数ですが、const char*型は、const を活かしたまま const std::string*型を渡すように変更しました。const修飾子は C++ でも非常に重要な機能です。積極的に使いましょう。

実際には C++ では、このような場面では、ポインタよりも参照を使うことが多いです(第16章)。

また、元のプログラムでは、第2引数で文字列の長さを渡すようになっていましたが、std::string ならば、それ自身が自分の長さを知っているので、引数で指定する必要性はなくなります。長さは size関数で取得できる他、空文字列になっているかどうかは empty関数で知ることができます。


参考リンク


------------------------------------------------------------------------

更新履歴

'2018/7/16 全体的に見直し修正。
C++標準ライブラリの string の利用」の後ろにあった「ワイド文字列」の項を、後ろの方へ移動した。

'2013/10/5 新規作成。



第4章のメインページへ

C++編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー