c++で最初と最後の文字を除いた部分文字列を取り出す方法を教えていただきたいです。pythonでは下記のようなコードで取り出せるのですがc++でもこのような簡潔な方法があるでしょうか?よろしくお願いします。
python
1test="abcdefg" 2print(test[1:-1]) 3 4 5output: 'bcdef'
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
C++では歴史的経緯と速度追求のため単に文字列といってもいろいろあります。
新規にメモリーを割り当てて部分文字列を作成するのであれば、ttyp03さんの方法で構いません。
すでにあるメモリーを書き換えてしまって良いのならば
cpp
1std::string str = "abcdefg"; 2str.pop_back(); 3str.erase(0, 1);
という手もあります。
また所有権がいらないならばC++17で追加されたstd:::string_view
を使って
cpp
1std::string str = "abcdefg"; 2auto sv = std::string_view(str).substr(1, str.length() - 2);
という手もあります。
ところで、std::string
にしろstd::basic_string
にしろchar
型が1単位となるのですが、ここで文字列がどのようなエンコードであるかは一切規定がありません。
つまり一文字をどう定義するかも重要になります。
かりにUnicodeだとしてもUnicodeには1文字の定義が4通りあります。あなたが欲しい「1文字」はどれでしょうか?
C++標準化委員会、ついに文字とは何かを理解する: char8_t#Unicodeにおける4つの文字の定義
上記や他の方の解答は1文字をbyte単位で見たとき、ないしcode units単位の指定方法です。それ以外の「1文字」で指定したいなら、だいぶ面倒な作業が必要になります。
codepoint単位で指定したい場合、2通りの考え方があって、
- 1code units=1codepointとなるUTF-32に変換してしまう→上と同じようにできる
- (入力がUTF-8なときに)UTF-8のbyte列から何codepointか判定する
前者の場合はC++標準に文字コード変換手段はありませんので、Win32APIやiconv, icuなどの外部ライブラリを利用することになります。後者の場合は
UTF-8の文字列の文字数を数える - Qiita
に紹介のあるようなif文をかいてあげることで判定できます。
書記素単位で指定したい場合は、もはや自分で判定を書くのは現実的ではありません。
UTF-8の文字列の文字数を数える - Qiita
に判定式が書かれていますが、Unicodeにおける書記素の切れ目の判定方法はUnicodeのバージョンが上がるごとに壊れるといってよいので、自力でメンテナンスは不可能です。どのくらい破壊的変更がはいるかというと、とあるJavascriptで書かれたライブラリでUnicode v8からv10にあげるのに
Upgrade to support Unicode v10.0 by vaskevich · Pull Request #4 · foliojs/grapheme-breaker
このくらい変更が必要でした。自力でメンテナンスできますか?むりですね。
というわけでicuというライブラリを使うことになりますが、この具体的な利用方法は割愛します。
投稿2019/05/09 09:44
総合スコア5852
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/09 11:52