質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1803閲覧

c++で最初と最後の文字を除いた部分文字列を取り出す方法

kyabaria

総合スコア13

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/05/09 07:38

編集2019/05/09 07:39

c++で最初と最後の文字を除いた部分文字列を取り出す方法を教えていただきたいです。pythonでは下記のようなコードで取り出せるのですがc++でもこのような簡潔な方法があるでしょうか?よろしくお願いします。

python

1test="abcdefg" 2print(test[1:-1]) 3 4 5output: 'bcdef'

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kyabaria

2019/05/09 11:52

とても詳しい説明ありがとうございました。Unicodeには1文字の定義が4通りあるなど自分の知らないことを色々学ばせていただきました。プログラミング言語について自分の知識の浅さを痛感いたしました。紹介いただいたリンクをもとに少しでも理解を深めたいと思います。
guest

0

ベストアンサー

こんな感じでしょうか。
C++に詳しくないので達人の回答もお待ちください。

cpp

1std::string str = "abcdefg"; 2cout << str.substr(1, str.length() - 2);

投稿2019/05/09 08:08

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kyabaria

2019/05/09 11:54

ありがとうございました。自分の行いたかった機能が実装できました。
guest

0

こちらの「文字・文字列の削除」ってところが参考になると思います。
pythonでは簡単に出来ても、根本的に文字列が苦手なC++ではやりにくい事も多々ありますのでご注意ください。

投稿2019/05/09 08:40

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kyabaria

2019/05/09 11:43

参考になるページを紹介していただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問