アフィリエイト広告を利用しています

広告

posted by fanblog

2017年09月28日

《その53》 文字列リテラル(p.294演習8-1,p.295演習8-2,p.297演習8-3)


文字配列の初期化
    char[] = {'A', 'B', 'C', '\0'};
char[] = "ABC";( 終端にナル文字'\0'が挿入される。)

文字列リテラルには静的記憶域期間が与えられる。

文字列リテラルが関数の中にあっても外にあっても同様。

静的記憶域期間
プログラム実行開始時の準備段階でオブジェクトが生成されて、プログラムの
終わりまで生き続け、最後に破棄される。



新版明解C++入門編 p.294 演習8-1
 List8-4の配列 s の宣言を以下のように書きかえたプログラムを作成せよ。
    char s[] = "ABC\0DEF";
実行結果に対する考察を行うこと。

// p294_演習8-1
#include <iostream>
#include <typeinfo>
using namespace std;

int main()
{
char s[] = "ABC\0DEF";
cout << "char s[] = \"ABC\\0DEF\";" << '\n';

cout << '\n';
cout << "cout << s;" << " → " << s << " と表示される。\n";
cout << "sizeof(s)" << " … " << sizeof(s) << '\n';
cout << "sizeof(s[0])" << " … " << sizeof(s[0]) << '\n';
cout << "typeid(s).name()" << " … " << typeid(s).name() << '\n';
cout << "typeid(s[0]).name()" << " … " << typeid(s[0]).name() << '\n';

cout << '\n';
for (int i = 0; i < sizeof(s) / sizeof(s[0]); i++) {
if (s[i] == '\0')
cout << "\\0" << '\n';
else
cout << s[i] << '\n';
}
}

b08_01_.png
考察:
 文字列"ABC\0DEF"は、末尾のナル文字'\0'を含めて8文字分の領域を占有する。
 文字列"ABC\0DEF"は、文字列"ABC\0"と文字列"DEF\0"が隣接した文字列リテラルである。
 cout << s; で表示されるのは最初のナル文字までの「 ABC 」である。



新版明解C++入門編 p.295 演習8-2
 以下のように初期化された文字列 s を空文字列にするコードを示せ。
    char s[] = "abc";

 コードはの次のようになると思いますが、これでは画面に何も表示されません。
#include <iostream>
using namespace std;

int main()
{
char s[] = "ABC";
for (int i = 0; i < sizeof(s) / sizeof(s[0]); i++)
s[i] = '\0';
}

 画面で確認できるように、次のようなプログラムにしました。

// p295_演習8-2
#include <iostream>
using namespace std;

int main()
{
char s[] = "ABC";

cout << "s … " << s << '\n';
for (int i = 0; i < sizeof(s) / sizeof(s[0]); i++) {
if (s[i] == '\0')
cout << "\\0" << '\n';
else
cout << s[i] << '\n';
}

for (int i = 0; i < sizeof(s) / sizeof(s[0]); i++)
s[i] = '\0';

cout << "\n空文字列にした後\n";
cout << "s … " << s << '\n';
for (int i = 0; i < sizeof(s) / sizeof(s[0]); i++) {
if (s[i] == '\0')
cout << "\\0" << '\n';
else
cout << s[i] << '\n';
}
}

b08_02.png



新版明解C++入門編 p.297 演習8-3
 文字列中の大文字を小文字に変換した上で表示する関数 put_lower を作成せよ。
    void put_lower(const char s[]);

// p297_演習8-3
#include <cctype>
#include <iostream>
using namespace std;

void put_lower(const char s[])
{
for (int i = 0; s[i]; i++)
cout << static_cast<char>(tolower(s[i]));
/*
s[i] == 0 となった時点で for文が終了する。
C++ のプログラムでは、'\n'でなく 0 を使うが一般的。

tolower関数の返却値は int型なので、そのままでは文字コードが
整数値として表示されてしまう。
そのため、char型にキャストした上で表示している。

*/
}

int main()
{
char str[36];

cout << "文字列:";
cin >> str;

put_lower(str);
cout << '\n';
}

b08_03.png


新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/8/30 21:02時点)









--
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/6750223
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。