モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

文字列 string クラス (C++をもう一度)

モーダルを閉じる

ステッカーを選択してください

お支払い手続きへ
モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2014/12/11
最終更新最終更新
2017/04/22
記事区分記事区分
一般公開

目次

    低レイヤーのプログラミングとOS開発が趣味。C言語を使っています。

    サンプルコード

    #include <iostream>
    #include <string>
    #include <cstring> // strcmp を使用するため
    using namespace std;
    
    void Show(const char* str) {
        cout << str << endl;
    }
    
    int main() {
        // 初期化
        string str = "my string";
        string str2("my string"); // としても同じです
    
        // 拡張
        str += ", extended";
    
        // 長さ
        str.size();
        str.length(); // としても同じです
    
        // 要素取得
        str[0];
        str.at(0); // としても同じです
    
        // ヌルターミネータを末尾に付与して
        // const char* を返す
        // (str の非constメンバ関数によって
        //  const char* が指すアドレスが解放されたり
        //  書き換えられたりする可能性があることに注意
        // )
        Show(str.c_str()); //=> my string, extended
    
        // ヌルターミネータ '\0' を string 自体は必要と
        // しないため、要素の途中に '\0' を含められます
        str[1] = '\0';
        Show(str.c_str()); //=> m
        cout << str.size() << endl; //=> 19
    
        // ヌルターミネータを末尾に付与することを「保証
        // せず」に const char* を返す (ヌルターミネータを
        // 必要としないことを明記できるため c_str() と使い分けると
        // ソースコードが読み易くなります)
        str.data();
    
        // 標準入力から取得した値を代入
        cout << "INPUT: " << flush; // 改行しないで書き出す (復習)
        getline(cin, str);
        cout << "YOUR INPUT: " << str << endl; // 改行する。そして書き出す (復習)
    
        // const char* で同じことをやる場合 (復習)
        char cstr[128];
        cout << "INPUT: " << flush;
        cin.getline(cstr, 128);
        cout << "YOUR INPUT: " << cstr << endl;
    
        // 文字列の比較
        if (str == "string");
    
        // const char* で同じことをやる場合 (復習)
        // - #include <cstring> が必要
        // - 等しい場合は 0 を返す
        // - 辞書順で cstr < string ならば -1 を返す
        // - 辞書順で cstr > string ならば +1 を返す
        if (strcmp(cstr, "string") == 0);
    
        // 右から検索、左から検索
        str = "s*ri*g";
        string::size_type rpos = str.rfind("*");
        string::size_type lpos = str.find("*");
        cout << rpos << endl;       //=> 4
        cout << lpos << endl;       //=> 1
    
        // 二文字以上での検索
        string::size_type pos = str.rfind("ri");
        cout << pos << endl; //=> 2
    
        // 検索結果がないかどうかの判定
        if( string::npos == str.find("+") ); //=> true
    
        // 挿入 (↓検索結果の直前に挿入されます)
        str.insert(pos, "_INSERT_");
        cout << str << endl; //=> s*_INSERT_ri*g
    
        // 文字列の長さを変更
        str.resize(8);
        cout << str.size() << endl; //=> 8
        cout << str.capacity() << endl; //=> 19
    
        // メモリ領域を予め「最低でも」 32 要素分確保して
        // resize時などに new やコピーの頻度軽減を狙う
        str.reserve(32);
        cout << str.size() << endl; //=> 8
        cout << str.capacity() << endl; //=> 38
    
        // 空にする
        str.clear();
        cout << str.size() << endl; //=> 0
        cout << str.capacity() << endl; //=> 38
    
        // 長さが 0 であれば true
        str.empty();
    
        // 削除して詰める (i 番目から n 文字)
        str = "string";
        str.erase(1, 3);
        cout << str << endl; //=> sng
    
        str = "string";
        str.erase(1, string::npos); // 最後まで削除
        cout << str << endl; //=> s
    
        // 置換 (i 番目から n 文字を s で置換)
        str = "string";
        str.replace(1, 3, "TRI");
        cout << str << endl; //=> sTRIng
    
        // 部分文字列
        str = "string";
        cout << str.substr(1, 3) << endl;            //=> tri
        cout << str.substr(1, string::npos) << endl; //=> tring
    
        // 日本語の検索
        // - Unicodeを使用するとバイト数は大きくなるが
        //   検索時の問題は避けられる (推奨)
        // - Shift_JISなど日本語用の文字セットを使用すると
        //   バイト数は小さくなるが、検索時に問題が発生 (非推奨)
        str = "予定表.txt";
        string::size_type mbpos = str.find("表");
        cout << mbpos << endl; //=> 3 (UTF-8で符号化されている場合。Shift_JISではエラー)
        str.insert(mbpos, "_挿入_");
        cout << str << endl; //=> 予定_挿入_表.txt
    
        return 0;
    }
    

    文字列を生成 (stringstream)

    #include <iostream>
    #include <sstream>
    using namespace std;
    
    int main() {
        stringstream ss;
    
        ss.str("");  // 初期化
        ss << "10 9" << flush; // 改行なしで書き出す
    
        string str = ss.str();
        cout << str << endl; //=> 10 9
    
        int a, b;
        ss >> a >> b; // cin っぽく
        if(ss.fail()) {
            // 例えば ss に "10" しか入っていない場合 b には
            // 値が格納できず ss.fail() が true になります。
            cerr << "a or b is not initialized." << endl;
        }
    
        cout << a << endl; //=> 10
        cout << b << endl; //=> 9
    
        return 0;
    }
    
    Likeボタン(off)0
    詳細設定を開く/閉じる
    アカウント プロフィール画像

    低レイヤーのプログラミングとOS開発が趣味。C言語を使っています。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    >>さらに詳しくステッカーを贈る
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      ログインする

      関連記事