C++相談室 part29

このエントリーをはてなブックマークに追加
NULL character を含む文字列 ("aaa\0bbb\0ccc\0\0" みたいなの) を std::string で
扱いたいんだけど、どうやって代入すればいいですか?

string s = "aaa\0bbb\0ccc\0\0";

だと、"aaa" までしか代入できません。
basic_string(const E *s, size_type n, const A& al = A());
basic_string(const_iterator first, const_iterator last, const A& al = A());
\x00は?
>>952
> string s = "aaa\0bbb\0ccc\0\0";
そりゃ初期化だ。初期化なら >>953 の挙げてるコンストラクタ使え。
代入なら同じ引数のassign使え。

リテラルのサイズを取得するのに、templateを使うと幸せになれるかもしれない。
template< std::size_t N > inline std::string& assign_literal( std::string& target , char const ( &literal )[ N ] ){ return target.assign( literal , N - 1 ); }
>>953,955
うわっ、レス早っ!
こんな感じでいいのかな?

char *p = "aaa\0bbb\0ccc\0\0";
string s(p, 13);
string t;

cout << s << endl;
cout << s.size() << endl;

t.assign(p, 13);
cout << t << endl;
cout << t.size() << endl;

どうもでした。
こまかい突っ込みですまんが。
× char *p = "aaa\0bbb\0ccc\0\0";
○ char const *p = "aaa\0bbb\0ccc\0\0";
>>956
>>955の書いたテンプレート関数なら
std::string s;
assign_literal(s, "aaa\0bbb\0ccc\0\0");
で済みますな。長さを別途与えなくてもいい
>× char *p = "aaa\0bbb\0ccc\0\0";
ほんと糞下らんこと言う奴いるな。
いったん初期化したあとで別のアドレス指すのかもしれんだろうが。
>>957
お前の意図したコードは↓じゃないか?

char const * const p = "aaa\0bbb\0ccc\0\0";
char const ってあったっけ?
const char *const p = ...
ならあると思うが
chsr constは const char と同意。間違いない。それぐらい調べてからコメントしろ。
というより const が直後を修飾すると考えると
char const の方がbetter だと思う。特にpointerのアドレスか内容かをconst指定する際
char const *p;
はわかりやすいと思う
>>964
> char const の方がbetter だと思う。

そうか、読みにくいから俺はいつも const char だ。
>>964
> const が直後を修飾すると考えると

漏れの場合その道理でいくとconstが*にかかって
ポインタを移動できなくなるんじゃないかと誤解するなぁ。
>>constが*にかかって
char *p;
で*pをポインタと考えてるからだろうが!違うぞ pがポインタで*pはその内容を意味する。
だから
char const *p
は p の指す内容を不変とすること。
char * const p;
は p の指すアドレスそのものを不変とすること。
型を修飾すると考えるほうがわかりやすいような希ガス。
>>964
constが直後を修飾するという考えなら
const charでいいだろ。あくまでchar型のインスタンすを定数と
考えるんだからな。
long だってlong int ってするようにな。
971966:04/05/08 22:58
>>968
> で*pをポインタと考えてるからだろうが!

いや、宣言時には*がポインタを表す装飾だと思って(思い込んで)いるから。
漏れの場合*とpは離して書いてるが、それも宣言専用の装飾だと思っているから。
ちょっと無理のある表現だが
const char pointer p;
みたいな感じかな。

> pがポインタで*pはその内容を意味する。

だとすると、
char *p="null po";
はおかしな表現に思えてしまう。
あくまで宣言のみの表現で*pが内容を意味しないと解釈すると
上のようにpointerに置き換えられるので納得しやすい。

あとは定数の表現をchar constではなくconst charと覚えているから
const charのポインタということでconst char *にしているというのもある。
というか、char constって書き方ができるってのはいいが、
そういう表現を積極的に採用してる書籍ってあるのか?
ストラウストラップだってconst charだろ?
char型の・・・ただのchar型でなくて、定数のchar型・・・
というような順の修飾と考えたほうが自然だと思うけどなぁ。

char constという表現を知らんやつがいても仕方ないぐらい、
特殊な書き方だと思うよ。
アスタリスクを通る縦線を引いて、分類せよ。って書いてあったじゃん。
>char *p="null po";
>はおかしな表現に思えてしまう。

これは、本来は文法的にはあまりよろしくない書き方だ。
初期化が面倒だから、K&Rにもこういう書式を許しているし、コンパイラもOKだが
本来は

char *p;
p="おまえはバカ";


であるからな。厳密に考えるとCにはおかしな書式がいくつかある。
>>974
( ゚д゚)ポカーン
>>972
それはお前がバカだから、

Effective C++

読んでから言え。もっとも積極的に勧めてるわけじゃなく、
両方読める必要があると言っている。
お前はそれを知らなかったんだから、知る必要があったわけだ。
無知をひけらかして恥さらすな。
宣言したインスタンスに対し初期化するという意味なら別におかしいとは
思わんよ。
どんな修飾がついてたって、インスタンスはpであってその内容を代入してる
わけだから。修飾子とインスタンスを切り離して考えれば自然ではある。

char *p = "おまえがバカ";
でいいと思う。
978966:04/05/08 23:13
>>972
const char *で宣言してもコンパイラのエラー出力ではchar const *になってたりするけどな。

話はちょっと反れて関数のポインタが&をつけなくても
取得できるのがおかしいというのをたまに聞くが、
あれも関数名はポインタそのもので()がポインタを解決する(実際には実行するんだが)為の
operatorと考えていて何も疑問を感じていない。
むしろ関数名に&を付けて関数のポインタを得られることが不思議だったりする。

メンバ関数に対するconstでもないしそろそろCスレ行きか。
ルールを単純にしたいがため、「constは左の型を修辞する」というルール一本にした。
他所から拾ってきたソースや過去の自分のソースで const char とか書いてあるのを見たときに少し考えてしまう。

> そういう表現を積極的に採用してる書籍ってあるのか?
David Abrahamsによるboostのソースはそうなっている。
上記のルールの一本化も彼のコーディングガイドラインによるもの。
少し前のgccの出力がそうなっていたが、最近はconstが右につくようになった。
>long だってlong int ってするようにな。

話にならんな。
この場合 long は int を修飾するだけ

int long x;

とやって long が xを修飾する必要がどこにあるんだ。

char const *p;
の const がポインタ内容を修飾する必要のある場合とは全く意味が違う。

例を持ち出すならもっと的確な事例を挙げてろ
>>978
関数名は関数型を持ち、関数型は関数へのポインタへ暗黙の変換が効く。
関数への参照という型も存在する。
この認識がないと、templateで関数型を扱うものが理解できない。
>>974
> 本来は
> char *p;
> p="おまえはバカ";

と言われても、
char const * const p;
p = "NULLPO";
と書くと警告でちゃうぞ。

>>976
何熱くなってんだ ?
誰も const char と char const のどちらかしか読めないなんて書いてないぞ。
>>976
バカはおまえだ。俺は両方の表現知ってたし、あくまで
const char より char const の方を押してる書籍の話を
言ってんだ。それが積極的ってことだろ。Effe C++だって
char constを押してるわけじゃない。知る必要とかじゃなくて
どっちが一般的かって話してんだよ。それからお前はEffe C++
がすべてか。バ・カ・タ・レ。
>話はちょっと反れて関数のポインタが&をつけなくても

関数のポインタってなんだ?関数へのポインタのことか?

これ以上constの位置について話すのならコチラへどうぞ→http://pc5.2ch.net/test/read.cgi/tech/1078193971/
なにあつくなってんだクズども

class Class { ... } typedef C;
>>986
お前のことだ(w
>>983
お前が何にも知らんことは文面から用意に察することができたのでバカでも知ってる教科書名を挙げてやったのよ。
一通りよんでりゃ、const の前置、後置ぐらいでスレ汚すバカは居ないだろうからな。勉強になったことを感謝しろ。

日 本 海 溝 よ り 教 育 レ ベ ル の 低 い 糞 ガ キ よ 。



>>984
それぐらい理解しろよ。
人と話したことないのか ?
990966:04/05/08 23:29
>>977
>>971と同じ意見だよな。ありがとう。
が、あくまでソースから受ける印象の話であって何が正しいという話はしていないことに注意。

>>984
すまん。関数へのポインタ。

>>981
恥ずかしながら関数型という言葉を知らないんだが具体例をきぼん。
ということでC++の話題へ。
とりあえず落ち着け。
>>988
海溝は深いと言うべきだな。
>>988
しまいにゃ言えることはその程度かw。死ね。
>>952
最後に'\0'を2回付けたいのなら"〜\0"で十分では?
議論は構わないがそう熱くなるな。
端から見てると単なるケンカにしか見えないから。
まず日本語の読解力を身につけろよ。
>と言われても、
>char const * const p;
>p = "NULLPO";
>と書くと警告でちゃうぞ。

それはね、内容もアドレスも不変と宣言してるのに、宣言した時点より跡で代入してるから。
すいません熱いところ申し訳ないんですが次スレはドコですか
>>984
>それぐらい理解しろよ。
>人と話したことないのか ?

君ポインタの扱いが十分わかってないね。
関数のポインタなんて表現はありえない。
つまり、わかってる奴は絶対こういう表現はしない。
>バカはおまえだ。俺は両方の表現知ってたし、
バーカ。こんなこと知ってるぐらいのことを何宣言してんだ。アホの活造りかおまえ。
1000! って言うか次スレ…
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。