C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

stringクラス文字列を文字数で区切りたい /ビキナー (18/11/04(Sun) 14:22) #89171
Re[1]: stringクラス文字列を文字数で区切りたい /Jitta (18/11/04(Sun) 20:43) #89173
│└ Re[2]: stringクラス文字列を文字数で区切りたい /ビキナー (18/11/04(Sun) 21:10) #89174
│  ├ Re[3]: stringクラス文字列を文字数で区切りたい /Azulean (18/11/04(Sun) 22:26) #89175
│  ├ Re[3]: stringクラス文字列を文字数で区切りたい /にゃるら (18/11/05(Mon) 12:37) #89181
│  └ Re[3]: stringクラス文字列を文字数で区切りたい /Jitta (18/11/05(Mon) 13:50) #89185
Re[1]: stringクラス文字列を文字数で区切りたい /魔界の仮面弁士 (18/11/05(Mon) 11:55) #89179


親記事 / ▼[ 89173 ] ▼[ 89179 ]
■89171 / 親階層)  stringクラス文字列を文字数で区切りたい
□投稿者/ ビキナー (1回)-(2018/11/04(Sun) 14:22:17)

分類:[C/C++] 

タイトルの通りです。言語はC++です。

stringクラスで宣言した文字列を、文字数で区切る良い方法はないでしょうか?

例(3ビットで区切りたい):
string str = "123456789012";
string str2[10];

結果
str2[0] = "123"
str2[1] = "456"
・・・

みたな感じにしたいと思っています。
[ □ Tree ] 返信 編集キー/

▲[ 89171 ] / ▼[ 89174 ]
■89173 / 1階層)  Re[1]: stringクラス文字列を文字数で区切りたい
□投稿者/ Jitta (422回)-(2018/11/04(Sun) 20:43:07)
No89171 (ビキナー さん) に返信
> タイトルの通りです。言語はC++です。
>
> stringクラスで宣言した文字列を、文字数で区切る良い方法はないでしょうか?
>
> 例(3ビットで区切りたい):
> string str = "123456789012";
> string str2[10];
>
> 結果
> str2[0] = "123"
> str2[1] = "456"
> ・・・
>
> みたな感じにしたいと思っています。


一度、書いてみるといいですよ。

0番目・・・0から
1番目・・・3から
2番目・・・6から
3番目・・・9から

n番目の文字列は、区切りたい文字数×(n−1)番目から始まる。

[ 親 89171 / □ Tree ] 返信 編集キー/

▲[ 89173 ] / ▼[ 89175 ] ▼[ 89181 ] ▼[ 89185 ]
■89174 / 2階層)  Re[2]: stringクラス文字列を文字数で区切りたい
□投稿者/ ビキナー (2回)-(2018/11/04(Sun) 21:10:35)
No89173 (Jitta さん) に返信
> ■No89171 (ビキナー さん) に返信
>>タイトルの通りです。言語はC++です。
>>
>>stringクラスで宣言した文字列を、文字数で区切る良い方法はないでしょうか?
>>
>>例(3ビットで区切りたい):
>>string str = "123456789012";
>>string str2[10];
>>
>>結果
>>str2[0] = "123"
>>str2[1] = "456"
>>・・・
>>
>>みたな感じにしたいと思っています。
>
>
> 一度、書いてみるといいですよ。
>
> 0番目・・・0から
> 1番目・・・3から
> 2番目・・・6から
> 3番目・・・9から
>
> n番目の文字列は、区切りたい文字数×(n−1)番目から始まる。
>


回答ありがとうございます。
それはchar型配列の話ではないのです??

stringクラス型配列の場合の話は、また話が変わってくるのではないのでしょうか?
[ 親 89171 / □ Tree ] 返信 編集キー/

▲[ 89174 ] / 返信無し
■89175 / 3階層)  Re[3]: stringクラス文字列を文字数で区切りたい
□投稿者/ Azulean (1006回)-(2018/11/04(Sun) 22:26:05)
No89174 (ビキナー さん) に返信
> 回答ありがとうございます。
> それはchar型配列の話ではないのです??
>
> stringクラス型配列の場合の話は、また話が変わってくるのではないのでしょうか?

string は char 配列を内包したようなものなので、イテレーターを使うとか、data/c_str 関数を使うとかすれば、char 配列っぽく扱えますけどね。
指定した範囲の文字列を取り出したいなら substr でよいでしょう。
[ 親 89171 / □ Tree ] 返信 編集キー/

▲[ 89174 ] / 返信無し
■89181 / 3階層)  Re[3]: stringクラス文字列を文字数で区切りたい
□投稿者/ にゃるら (47回)-(2018/11/05(Mon) 12:37:13)
No89174 (ビキナー さん) に返信
まずstringクラスってなんでしょうか。
std::stringクラスのことでしょうか、CStringクラスのことでしょうか?それとも別?

No89173 (Jitta さん) はヒントを与えてくれています。
文字列を扱うクラスであれば、何番目の文字ってのにアクセスできる関数が付いていると思います。
それを使って、文字列の読み取りたい位置を見つけて、ほしい分だけ読み進めればよいよってことだと思います。
その読み取りたい位置を探すのがn番目であれば、区切りたい文字数×(n−1)、って計算で求められるよってことなのではないでしょうか。
std::stringなら、at関数でほしい位置のcharが得られます。itreratorを使うのもいいと思います。
ほしい長さのchar配列をつくり、そこに得た文字を埋め込み、char[]->stringしてくれる関数(std::stringならコンストラクタ)を呼べばよいかと。

途中でchar[]->stringをしたくないのであれば、ほしい文字列の位置から一定の長さで「文字列」として取得するstd::stringのsubstr関数を使ってみると良いと思います。(■No89179 (魔界の仮面弁士 さん) が、その詳細を書いていただけてますね)

[ 親 89171 / □ Tree ] 返信 編集キー/

▲[ 89174 ] / 返信無し
■89185 / 3階層)  Re[3]: stringクラス文字列を文字数で区切りたい
□投稿者/ Jitta (423回)-(2018/11/05(Mon) 13:50:08)
No89174 (ビキナー さん) に返信
> 回答ありがとうございます。
> それはchar型配列の話ではないのです??
>
> stringクラス型配列の場合の話は、また話が変わってくるのではないのでしょうか?

「文字列を文字数で区切りたい」のでしょ?
では、何が、わからないのでしょうか。
「文字数で区切る良い方法はないでしょうか?」とのことなので、
n番目の文字列が元の文字列の何番めから始まるのかがわからないのだと理解したのですが?
string は、コンピュータ系ではたいてい「文字列」と訳されます。
char型は、たいてい「文字型」と認識されます。
文字が列になっているのが文字列なので、string型はたいてい、文字の配列と同じように扱えるよう、実装されています。

ちなみに、「ビット」は、コンピュータ業界ではたいてい0か1の値をとります。
元々の意味は「小さな破片」なので、文字列を「文字を単位とした破片の集合」とみなすのもアリかと思いました。

あと、文字のバイト数は決まっていないことには留意しておきましょう。
[ 親 89171 / □ Tree ] 返信 編集キー/

▲[ 89171 ] / 返信無し
■89179 / 1階層)  Re[1]: stringクラス文字列を文字数で区切りたい
□投稿者/ 魔界の仮面弁士 (1921回)-(2018/11/05(Mon) 11:55:29)
No89171 (ビキナー さん) に返信
> 例(3ビットで区切りたい):
> string str = "123456789012";

『3 ビット』で区切るの意味にもよりますが、
"123……" という文字列を 3bit で区切ると
→ 16進数では: 31,32,33,……
→ 2 進数では: 00110001,00110010,00110011,……
→ 3 bit 区切: 001,100,010,011,001,000,110,011,……
になりますね。


> stringクラスで宣言した文字列を、文字数で区切る良い方法はないでしょうか?

「3 ビット」なのか「3 文字」なのか「3 バイト」なのかで変わってきますが、
> str2[0] = "123"
> str2[1] = "456"
という結果を得たいのであれば、Jitta さんや Azulean さんの回答を参考に
 str2[0] = str.substr(0u, 3u);
 str2[1] = str.substr(3u, 3u);
 str2[2] = str.substr(6u, 3u);
 str2[3] = str.substr(9u, 3u);
になるように切り出していけると思います。
ただし、マルチバイト文字は含まれないという前提で。


using namespace std;

size_t chunkSize = 3u;

size_t const limitIndex = 10u;
string str = "123456789012";
string str2[limitIndex];

size_t maxIndex = (size_t)ceil(str.length() / (double)chunkSize);
if (limitIndex < maxIndex) { maxIndex = limitIndex; }
for (size_t i = 0u; i < maxIndex; i++) { str2[i] = str.substr(i * chunkSize, chunkSize); }
[ 親 89171 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -