CLIで学習を続けてますが、一方的に表示するだけだと飽きませんか?
せっかくなのでCLIに文字を入力する方法を覚え、任意の値を利用できるようになりましょう。
CLIで文字入力
C#にはCLI経由で文字入力をする関数が用意されてます。
次のサンプルコードを実行して、何か文字列を入力した後に改行してください。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
string s = Console.ReadLine();
Console.WriteLine(s);
}
}
}
画面に入力した文字列が表示されましたよね。そして実際に文字列の入力を担当してくれた関数はこれです。
これはユーザーが改行するまで入力を受け付ける関数で、改行が発生すると、それまでに入力した文字列を返します。
Console.ReadLine();
CLIには入力した文字列も表示されるので、見た目は二重に見えますが、そういうものと理解してください。
数値として受け取る
先程の方法ではstring型として文字列を受け取りました。
では、数値(int型など)で受け取りたい場合はどうしたらいいでしょうか。
残念ですが直接数値で受け取ることはできません。これは文字列で入力してるので当たり前です。
そのため数値で利用したい場合、文字列を数値に変換してあげる必要があります。
その具体的な方法がこちらになります。このサンプルコードを実行してください。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
string s = Console.ReadLine();
// 文字列を数値に変換する
int n = int.Parse(s);
n++; // 数値を確認するためにインクリメントする
Console.WriteLine(n);
}
}
}
数値以外の文字列を入力したら変な文字が出てプログラムが落ちました。
その挙動であってるよ。そういう実行中にエラーが発生してプログラムが落ちることを実行時エラーと言います。
まず前提として覚えて欲しいのは、プログラムの世界に良い感じにやってくれる処理はありません。
もちろん何を良い感じと認識するかによりますが、今回のように数値になりえない文字列を変換するとプログラムは落ちます。
これの対策はそれほど難しくなく、大きく2つあります。
- 予め文字列を検査して数値以外が含まれるかを確認、問題ない場合のみ変換するようにコーディングする。
- 実行時エラーをcatch(キャッチ)して、それが発生した場合の対処を別途記述する。
どちらにもメリットとデメリットがありますが、今回は1つ目の対策を選択します。
ただし、2つ目も非常に重要な仕組みです。こちらは専用の記事を書くので別枠で学習しましょう。
ここではC#の例外処理について学びます。すでに少しだけ触れてますが、これは実行時エラーへの対策となります。ただ、例外処理もクラスの知識を必要とします。そのため60%くらいの解説になりますが、今はここまでいいと思ってます。 例外 (Exception) C#では実行時に発生するエラーを例外と言います。僕が知ってる他の言語も大半が同じだった気がします。この例外とは、特定の条件において処理を完了できない問題が起きると発生し、その例外を誰もcatch(キャッチ)しないとプログラムが強制終了し...
数値に変換できない場合の対策
まずは数値に変換が可能な文字列とは何でしょうか。ここではint型に変換するので実数は無視することにします。
そうすると0から9の数字しか含んでなければ、それは数字に変換できると言えます。めんどいから負数も無視します。
これを雑に実装したサンプルコードがこちらになります。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
string s = Console.ReadLine();
if (CheckNum(s))
{
int n = int.Parse(s);
Console.WriteLine(n);
}
else
{
Console.WriteLine("変換できません。");
}
}
// 数値のチェック用
static bool CheckNum(string s)
{
// こうすると文字列を表現する文字が順番に取得できる
foreach (char c in s)
{
switch (c)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
break;
default:
return false;
}
}
return true;
}
}
}
ここで文字コードの特性を知ってると、もう少しマシなコードを書けます。
そもそも文字コード?って人は以下の記事を参考にしてください。
0と1しか理解できないコンピュータ。では、どうやって文字や画像を表現するのでしょうか。ここでは最も簡単な文字の表現を学びましょう。 文字の表現方法 理論の話となるので、ここでは色々と簡略化して説明します。こんな文字は存在しませんが、大文字のAからZのみ、合計26文字だけで構成された文字を例にしましょう。 この文字を使って"LISA"を表現したい場合はどうしたらいいと思う? ヒントとか無いんですか? コンピュータは0と1しか分からないって常に考えることかな。 ...
文字コードってのは適当にコード化されてるわけじゃなく、ある程度の塊で連番になってます。
例えば数値やアルファベット、これらは処理で使いやすいよう連番になってます。
今回の場合は0 ~ 9も連番になってるので、次のように記述することができます。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
string s = Console.ReadLine();
if (CheckNum(s))
{
int n = int.Parse(s);
Console.WriteLine(n);
}
else
{
Console.WriteLine("変換できません。");
}
}
// 数値のチェック用
static bool CheckNum(string s)
{
// こうすると文字列を表現する文字が順番に取得できる
foreach (char c in s)
{
if (c < '0' || '9' < c) // 連番だから比較できる
return false;
}
return true;
}
}
}
実際は.NETの便利機能を使うほうが多いのですが、そればかりだとアルゴリズムが身に付かないので自前で作って練習しましょう。
自前のアルゴリズムを使うメリットってありますか?
残念だけど殆どない。.NETには数多くの便利関数が存在するから普通ならそっちを利用したほうがいいよ。
ただ、勉強って意味なら自前で作るのもあり。解説はしないけど、今回はint.TryParse()を使うと幸せになれると思うよ。
あとがき
任意の文字列を入力できるだけでプログラミングが楽しくなりませんか? これだけでプログラムの幅が劇的に広がりますよ。
◆ C#に関する学習コンテンツ
この記事は参考になりましたか?
コメント