stringの中身を書式化する場合 – 固定ページ 2 – プログラミング – Home

stringの中身を書式化する場合
 
通知
すべてクリア

[解決済] stringの中身を書式化する場合

固定ページ 2 / 2

ひろ
 ひろ
(@ひろ)
ゲスト
結合: 24年前
投稿: 149
 

そうでしょうねぇ。

buffer.assign(4,'a');
printf(%s, &buffer[0]);

実装依存だ言って、これでいちいち落ちていたんじゃ
使い物になりませんからねぇ。

でもC++でstringなのに、'\0'終端が実装依存というのは
納得行かないところではありますが。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

printf/sprintfみたいなC関数に適用するときゃc_str()しろ、と。
文字通りC文字列を作るためのc_str()ですし。

std::stringは途中に'\0'を含むことができるわけで、
文字列ちゅーより可変長文字配列としての意味合いが大きいように思います。


返信引用
ひろ
 ひろ
(@ひろ)
ゲスト
結合: 24年前
投稿: 149
 

> std::stringは途中に'\0'を含むことができるわけで、

そのときのlength()は、何を返すんですかね?
やっぱり'\0'までですよね。

Cの時代から、文字列とは'\0'で終端されているもので、
C++になってもその概念は変わらないと思っていました。

length()みたいな文字長を返す関数があり、
それで戻されるのは、文字列バッファと一緒に管理している
数値(文字長)だとしても、'\0'が実装依存で
1つもついてなくてもいいというのがSTLの仕様ならば、
個人的にはやはり違和感がありますね。

というか、タイトルから脱線しまくりですが。。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

>> 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]) ;
}
}


返信引用
固定ページ 2 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました