C++編で扱っている C++ は 2003年に登場した C++03
という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14
-> C++17 -> C++20 -> C++23 と更新されています。
なかでも C++11 での更新は非常に大きなものであり、これから C++
の学習を始めるのなら、C++11
よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい
C++ を学んでください。 当サイトでは、C++14 をベースにした新C++編を作成中です。
問題① 次のプログラムを、std::string を使って書き換えてください。
#include <cstring>
#include <iostream>
namespace {
void func(const char* s, std::size_t size)
{
if (size > 0) {
std::cout << s << " " << size << std::endl;
}
else {
std::cout << "empty" << std::endl;
}
}
}
int main()
{
char s1[10] = "abcde";
char s2[10] = "";
(s1, std::strlen(s1));
func(s2, std::strlen(s2));
func
std::strcpy(s2, "abcde");
(s2, std::strlen(s2));
func
if (std::strcmp(s1, s2) == 0) {
std::cout << "OK" << std::endl;
}
}
まず、書き換えた結果から。
#include <iostream>
#include <string>
namespace {
void func(const std::string* s)
{
if (s->empty()) {
std::cout << "empty" << std::endl;
}
else {
std::cout << *s << " " << s->size() << std::endl;
}
}
}
int main()
{
std::string s1("abcde");
std::string s2;
(&s1);
func(&s2);
func
= "abcde";
s2 (&s2);
func
if (s1 == s2) {
std::cout << "OK" << std::endl;
}
}
実行結果:
abcde 5
empty
abcde 5
OK
変数s1 の定義時に “abcde” を与えています。変数s2 の方は空文字列で初期化されます。
func関数の仮引数ですが、const char*型は、const を活かしたまま const std::string*型を渡すように変更しました。const修飾子は C++ でも非常に重要な機能です。積極的に使いましょう。
【上級】実際には C++ では、このような場面では、ポインタよりも参照を使うことが多いです(第16章)。
また、元のプログラムでは、第2引数で文字列の長さを渡すようになっていましたが、std::string ならば、それ自身が自分の長さを知っているので、引数で指定する必要性はなくなります。長さは size関数で取得できる他、空文字列になっているかどうかは empty関数で知ることができます。
全体的に見直し修正。
「C++標準ライブラリの string
の利用」の後ろにあった「ワイド文字列」の項を、後ろの方へ移動した。
新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |