そうでしょうねぇ。
buffer.assign(4,'a');
printf(%s, &buffer[0]);
実装依存だ言って、これでいちいち落ちていたんじゃ
使い物になりませんからねぇ。
でもC++でstringなのに、'\0'終端が実装依存というのは
納得行かないところではありますが。
printf/sprintfみたいなC関数に適用するときゃc_str()しろ、と。
文字通りC文字列を作るためのc_str()ですし。
std::stringは途中に'\0'を含むことができるわけで、
文字列ちゅーより可変長文字配列としての意味合いが大きいように思います。
> std::stringは途中に'\0'を含むことができるわけで、
そのときのlength()は、何を返すんですかね?
やっぱり'\0'までですよね。
Cの時代から、文字列とは'\0'で終端されているもので、
C++になってもその概念は変わらないと思っていました。
length()みたいな文字長を返す関数があり、
それで戻されるのは、文字列バッファと一緒に管理している
数値(文字長)だとしても、'\0'が実装依存で
1つもついてなくてもいいというのがSTLの仕様ならば、
個人的にはやはり違和感がありますね。
というか、タイトルから脱線しまくりですが。。
>> std::stringは途中に'\0'を含むことができるわけで、
>
> そのときのlength()は、何を返すんですかね?
> やっぱり'\0'までですよね。
いいえ。
#include <iostream>
#include <string>
using namespace std;
int main() {
string str = abc; str += '\0'; str += def;
for ( int i = 0; i < str.length(); ++i ) {
cout << ((str[i]=='\0') ? '_' : str[i]) ;
}
}