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

トップページC++編

C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 と更新されており、今後も 3年ごとに更新されます。
なかでも C++11 での更新は非常に大きなものであり、これから C++ の学習を始めるのなら、C++11 よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい C++ を学んでください。 当サイトでは、C++14 をベースにした新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 でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る