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';
}
}
考察:
文字列"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';
}
}
新版明解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';
}
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6750223
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック