先頭へ戻る

文字列の入力 解答ページ | Programming Place Plus 新C++編

Programming Place Plus トップページ -- 新C++編 -- 文字列の入力

先頭へ戻る

このページの概要

このページは、練習問題の解答例や解説のページです。



解答・解説

問題1 (確認★)

次のプログラムで、変数s1、s2、s3、s4、s5 はそれぞれどのような初期値になりますか?

#include <iostream>
#include <string>

int main()
{
    constexpr auto s = "Test";

    std::string s1 {};
    std::string s2 {""};
    std::string s3 {"Hello"};
    std::string s4 {s3};
    std::string s5 {s};
}


s1 は、{} の中身がないので、型に応じたデフォルト値で初期化されます(本編解説)。std::string型の場合は空文字列なので、s1 の初期値は "" です。

s2 は、明示的に空文字列 "" で初期化していますから、初期値は "" です。

s3 は、"Hello" で初期化していますから、初期値は "Hello" です。

s4 は、変数s3 の値を使って初期化します。s3 は "Hello" ですから、s4 の初期値は "Hello" です。

s5 は、constexpr変数s の値を使って初期化します。s は "Test" ですから、s5 の初期値は "Test" です。

実際に確認するとこうなります。

#include <iostream>
#include <string>

int main()
{
    constexpr auto s = "Test";

    std::string s1 {};
    std::string s2 {""};
    std::string s3 {"Hello"};
    std::string s4 {s3};
    std::string s5 {s};

    std::cout << s1 << "\n";
    std::cout << s2 << "\n";
    std::cout << s3 << "\n";
    std::cout << s4 << "\n";
    std::cout << s5 << "\n";
}

実行結果:



Hello
Hello
Test

問題2 (確認★)

次のプログラムは問題がありますか? あるとすれば、何が問題ですか?

#include <iostream>
#include <string>

int main()
{
    std::string s {""};
    std::cout << s[0] << "\n";
}


問題ありません。

変数s は空文字列で初期化されているので、s[0] には何もなさそうですが、少なくとも問題にはなりません。未定義動作になるのは、文字数(空文字列なら 0)を越えた数でアクセスしたときです(本編解説)。

実行結果:

問題3 (基本★)

次のプログラムの実行結果はどうなりますか?

#include <iostream>
#include <string>

int main()
{
    constexpr auto message = "Hello, World.";
    constexpr auto position = 3;

    std::cout << message[1] << "\n";
    std::cout << message[4] << "\n";
    std::cout << message[position] << "\n";
    std::cout << message[position + 4] << "\n";
}


message[1] は、constexpr変数 message の1文字目をアクセスしています。1文字目は「e」です。先頭の文字は0文字目であることに注意してください。

message[4] も同様です。4文字目は「o」です。

message[position] は、constexpr変数 position の値を使っています。position は 3 なので、message[3] としているのと同じです。よって、これは「l」です。

message[position + 4] では、constexpr変数 position の値を使うだけでなく、計算も行っています。position の値は 3 ですから message[3 + 4] としていることになり、message[7] のことです。よって、これは「W」です。

したがって、実行結果はこうなります。

実行結果:

e
o
l
W

問題4 (基本★★)

フルネーム、年齢、職業を対話的に入力させるプログラムを作成してください。つまり、

  1. フルネームを入力させる
  2. 入力を受けたら返答して、次に年齢を入力させる
  3. 入力を受けたら返答して、次に職業を入力させる
  4. 入力を受けたら返答して、プログラムを終了する

といった流れをつくってください。


たとえば、次のようになります。

#include <iostream>
#include <string>

int main()
{
    std::cout << "Please enter the your fullname.\n";
    std::string full_name {};
    std::getline(std::cin, full_name);

    std::cout << "Hello, " << full_name << ".\n";
    std::cout << "Please enter the your age.\n";
    int age {};
    std::cin >> age;
    std::cin.ignore();

    std::cout << "Please enter the your profession.\n";
    std::string profession {};
    std::getline(std::cin, profession);

    std::cout << "Your name: " << full_name << "\n";
    std::cout << "Your age: " << age << "\n";
    std::cout << "Your profession: " << profession << "\n";
}

実行結果:

Please enter the your fullname.
Saitou Ken                 <-- 入力したフルネーム
Hello, Saitou Ken.
Please enter the your age.
25                         <-- 入力した年齢
Please enter the your profession.
Software Enginner          <-- 入力した職業
Your name: Saitou Ken
Your age: 25
Your profession: Software Enginner

std::cin >> で年齢を入力した後、std::cin.ignore(); を入れておかないと、次の std::getline関数のときに、入力を待たずに先に進んでしまいます(本編解説)。

問題5 (応用★★★)

A~Z までのアルファベット26文字があります。1~26までのいずれかの整数を入力させ、その番号に応じたアルファベットを出力するプログラムを作成してください。たとえば、3が入力されたなら「C」を出力します。

1~26の範囲外の整数が入力されることは考えないものとして構いません。


たとえば、次のようになります。

#include <iostream>
#include <string>

int main()
{
    constexpr auto alphabets = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
    std::cout << "Please enter a number. (1 <= n <= 26)\n";
    int number {};
    std::cin >> number;

    std::cout << alphabets[number - 1] << "\n";
}

実行結果:

Please enter a number. (1 <= n <= 26)
3    <-- 入力した番号
C

アルファベットを並べた文字列が必要です。ここでは constexpr変数を使いました。

この文字列があれば、あとは入力された番号に応じて、その位置にある文字を出力すればいいです。ただし、文字列の先頭の文字が 0番目であることに注意が必要です。入力される番号は 1 で始まる仕様なので、alphabets[number - 1] のように、-1 する必要があります。


参考リンク



更新履歴




はてなブックマーク に保存 Pocket に保存 Facebook でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー