コンソールアプリでユーザーから文字を受け取るための最も基本的な方法がConsole.ReadLine
です。
初心者の方がつまずきやすいポイントは、Enterで確定する仕組みや、空行と終端入力で戻り値がどう変化するかです。
この記事ではConsole.ReadLineの基本と実践的な使い方を、丁寧なサンプルコードとともに解説します。
C# Console.ReadLineの基本
Console.ReadLineとは
基本の説明
Console.ReadLineは、キーボードから1行の文字列を読み取り、その文字列を戻り値として返すメソッドです。
戻り値の型はstring
で、ユーザーがEnterを押すまで入力待ちになります。
読み取られるのは1行単位で、行末の改行は含まれません。
最小コード例
// Console.ReadLineの最小例
using System;
class Program
{
static void Main()
{
Console.WriteLine("あなたの名前を入力してください:");
string name = Console.ReadLine(); // ユーザーがEnterを押すまで待つ
Console.WriteLine($"こんにちは、{name}さん!");
}
}
あなたの名前を入力してください:
Taro
こんにちは、Taroさん!
キーボード入力の流れ
流れの理解
入力の基本的な流れは次の通りです。
プロンプト(案内メッセージ)を表示し、ユーザーが文字をタイプし、Enterで確定します。
その後Console.ReadLine
が文字列を返します。
ここで返る文字列には行末の改行が含まれません。
ちょっとしたコツ
ユーザーが安心できるように、読み取り前にわかりやすいプロンプトを出すことが大切です。
プロンプトがないと、プログラムが止まっているように見えてしまいます。
Enterで確定する
Enterキーの役割
Enterキーは「1行の入力を確定する」操作です。
何も入力せずにEnterを押すと、戻り値は空文字(""
)になります。
入力は終了しますが、nullにはなりません。
確認コード
// Enterで確定し、空行は空文字になることを確認
using System;
class Program
{
static void Main()
{
Console.Write("何か入力してEnter(空でも可): ");
string line = Console.ReadLine();
if (line == "")
{
Console.WriteLine("空文字が入力されました。");
}
else
{
Console.WriteLine($"入力は「{line}」です。");
}
}
}
何か入力してEnter(空でも可):
空文字が入力されました。
戻り値と改行の扱い
改行は含まれない
Console.ReadLineは、行末の改行(Windowsでは\r\n)を取り除いた文字列を返します。
そのため、戻り値の末尾に改行は含まれません。
改行を出力したい場合はConsole.WriteLine
で行い、改行を出したくない場合はConsole.Write
を使います。
動作イメージのコード
// 改行の扱いを確認する例
using System;
class Program
{
static void Main()
{
Console.Write("都市名を入力してください: "); // 改行しない
string city = Console.ReadLine(); // 改行(\r\n)は含まれず、"Tokyo"などのみ入る
Console.WriteLine($"あなたの入力は「{city}」です。"); // ここで改行が付く
}
}
都市名を入力してください: Tokyo
あなたの入力は「Tokyo」です。
Console.ReadLineのプロンプト表示と入力パターン
質問を表示してから読む
分かりやすい尋ね方
まず質問をConsole.WriteLine
で表示してからConsole.ReadLine
で読むと、ユーザーは何を入力すればよいか理解しやすくなります。
// 質問を先に表示してから読むパターン
using System;
class Program
{
static void Main()
{
Console.WriteLine("年齢を入力してください:");
string ageText = Console.ReadLine(); // ここで入力待ち
Console.WriteLine($"入力された年齢は「{ageText}」です。");
}
}
年齢を入力してください:
18
入力された年齢は「18」です。
同じ行でプロンプトを出す
コンパクトなプロンプト
同じ行で入力させたいときはConsole.Write
を使います。
最後にスペースやコロンを入れて、入力位置を分かりやすくします。
// 同じ行でプロンプトを出すパターン
using System;
class Program
{
static void Main()
{
Console.Write("好きな言語は? "); // 同じ行で聞く
string language = Console.ReadLine();
Console.WriteLine($"あなたは「{language}」が好きなのですね。");
}
}
好きな言語は? C#
あなたは「C#」が好きなのですね。
複数回の入力を読む
ループで何度も読む
繰り返し読みたい場合は、whileループでConsole.ReadLine
を呼び続けます。
終了コマンド(例: exit)や終端入力(null)を条件に抜けるようにします。
// 複数回の入力を読み、"exit" または終端入力で終了する例
using System;
class Program
{
static void Main()
{
Console.WriteLine("メモを入力してください。終了するには「exit」と入力するか、Ctrl+Z(Windows)/Ctrl+D(macOS/Linux)で終端にします。");
while (true)
{
Console.Write("> "); // 入力プロンプト
string line = Console.ReadLine();
// 終端入力(null)なら終了
if (line == null)
{
Console.WriteLine("終端が入力されました。終了します。");
break;
}
// "exit"で終了(大文字小文字は区別しない)
if (line.Equals("exit", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("exitが入力されました。終了します。");
break;
}
Console.WriteLine($"メモ: {line}");
}
}
}
メモを入力してください。終了するには「exit」と入力するか、Ctrl+Z(Windows)/Ctrl+D(macOS/Linux)で終端にします。
> 買い物リスト
メモ: 買い物リスト
> exit
exitが入力されました。終了します。
Console.ReadLineの空文字とnull
空行は空文字になる
空行の扱い
何も入力せずにEnterを押した場合、戻り値は空文字(""
)です。
nullではありません。
この区別は入力検証で重要です。
// 空行(空文字)を識別する
using System;
class Program
{
static void Main()
{
Console.Write("任意の文字を入力(空行可): ");
string s = Console.ReadLine();
if (s == "")
{
Console.WriteLine("空文字が返されました(Enterのみ)。");
}
else
{
Console.WriteLine($"受け取った文字: 「{s}」");
}
}
}
任意の文字を入力(空行可):
空文字が返されました(Enterのみ)。
終端入力はnullになる(Ctrl+Z)
末尾(EOF)の扱い
入力の終端(EOF)が送られるとConsole.ReadLine
はnullを返します。
これはファイルの終端と同じ概念です。
コンソールでは次の操作でEOFを送れます。
- Windows: Ctrl+Zを押してからEnter
- macOS/Linux: Ctrl+D(Enterは不要)
空行の空文字とは別物なので、nullチェックを忘れずに行います。
// 終端入力(null)を検出する例
using System;
class Program
{
static void Main()
{
Console.WriteLine("何か入力してください。終端を送ると終了します。");
string line = Console.ReadLine();
if (line == null)
{
Console.WriteLine("nullが返りました(終端が入力されました)。");
}
else
{
Console.WriteLine($"入力は「{line}」です。");
}
}
}
何か入力してください。終端を送ると終了します。
^Z
nullが返りました(終端が入力されました)。
nullチェックの基本
安全な確認方法
nullは例外の原因になりやすいので、まずnullかどうかを確認してから処理します。
判定は== null
でも、パターンマッチングのis null
でも構いません。
// nullを先に判定し、その後に空文字や実データを判定する流れ
using System;
class Program
{
static void Main()
{
Console.Write("入力してください(終端で終了): ");
string line = Console.ReadLine();
if (line is null) // まずはnull判定
{
Console.WriteLine("終端検出: プログラムを終了します。");
return;
}
if (line == "") // 次に空文字判定
{
Console.WriteLine("空文字でした。");
return;
}
Console.WriteLine($"受信: 「{line}」");
}
}
入力してください(終端で終了):
空文字でした。
空文字とnullの違いを小さな表で整理します。
状況 | Console.ReadLineの戻り値 |
---|---|
何も入力せずEnter | 空文字(“”) |
終端入力(EOF) | null |
Console.ReadLineのコツと注意点
入力を確認してエコー表示
なぜエコーが有効か
受け取った入力を確認表示(エコー)すると、ユーザーもプログラムも間違いに気づきやすくなります。
特にループ処理では有効です。
// 入力内容をエコーして確認する
using System;
class Program
{
static void Main()
{
Console.Write("商品名: ");
string name = Console.ReadLine();
Console.WriteLine($"入力確認: 「{name}」");
}
}
商品名: Pen
入力確認: 「Pen」
前後の空白をTrimする
余計な空白の除去
ユーザーはうっかり前後に空白を入れがちです。
前後の空白はTrim
で取り除いてから判定や保存をすると実務的です。
// Trimで前後の空白を除去してから使う
using System;
class Program
{
static void Main()
{
Console.Write("ユーザーIDを入力: ");
string raw = Console.ReadLine();
if (raw is null)
{
Console.WriteLine("終端が入力されました。終了します。");
return;
}
string id = raw.Trim(); // 前後の空白を除去
if (id == "")
{
Console.WriteLine("空のIDは無効です。");
}
else
{
Console.WriteLine($"登録ID: 「{id}」");
}
}
}
ユーザーIDを入力: alice
登録ID: 「alice」
空入力なら再入力を促す
再入力の基本パターン
空文字を許可しない場合は、空のときに再入力を促すループを作ります。
null(終端)には丁寧に対応して終了します。
// 空文字なら再入力を促し、nullなら終了する入力ループ
using System;
class Program
{
static void Main()
{
string name;
while (true)
{
Console.Write("お名前を入力してください: ");
string input = Console.ReadLine();
if (input is null)
{
Console.WriteLine("終端が入力されました。登録を中止します。");
return;
}
name = input.Trim();
if (name == "")
{
Console.WriteLine("空では登録できません。もう一度入力してください。");
continue; // 再入力
}
// 妥当な入力を受け取ったらループを抜ける
break;
}
Console.WriteLine($"ようこそ、{name}さん!");
}
}
お名前を入力してください:
空では登録できません。もう一度入力してください。
お名前を入力してください: Hanako
ようこそ、Hanakoさん!
macOS/Linuxでは終端入力はCtrl+D
、WindowsではCtrl+Z
の後にEnterが必要です。
ただし、Visual Studio Codeのターミナルなど一部の環境では、Windowsであっても終端入力がCtrl+D
の場合があります。
実行環境に応じて案内メッセージを用意すると親切です。
まとめ
Console.ReadLineは「1行読み、改行を除いた文字列を返す」非常に基本的で強力なメソッドです。
プロンプトの出し方(同じ行か別行か)、空文字とnullの違い、Enterで確定する動作を理解すれば、入力まわりの多くの混乱は避けられます。
実務ではTrim
で余計な空白を取り除き、空入力時には再入力を促し、終端(null)には穏やかに終了するという定番パターンを実装します。
まずは本記事のパターンをそのまま写経し、次に自分の要件に合わせてメッセージや判定条件を調整してみてください。