コード入力欄のテンプレートで4行目くらいにある
var line_input = System.Console.ReadLine();
この標準入力に引っかかりまくったぷろぐらんまも多いと思う。
標準入力ってなかなか使わないから面白いくらい引っかかった。
この程度の内容書くために調べていたら4時間くらい使った、奥深い標準入力。
中の人はここまで引っかかったのを多分ほくそ笑んでいるそんなつもりはないと思う。
毎回こういう詰まらないことで引っかかって時間食うのもアホみたいだから
こういうことをしたいときはこう、をざらっと書いておく。
標準入力の前提知識
- コンソールから入力された値は数字でもstring型
- ただし1文字だとchar型
よくある罠
for文でぐるぐる回した結果を1行にして出力する場合は
テンプレートを下記のように書き換える必要がある。
for(int i = 0; i < line_input.Length; i++)
{
System.Console.Write();
}
出力結果例
2016 3 19
デフォルトでWriteLineだから地味に引っかかる。
以下パターン別対策、小難しいのは使わない方針で。
(using足すとLINQとか使えるけど、使って良いのかな)
半角スペースで分けているパターン
Dランクに多い気がする。
入力値
1 2 3 4 5
半角スペースを区切りに配列化
System.Console.Read().Trim().Split(' ');
出力結果
1 2 3 4 5
※そのままコンソール出力するとSystem.String[]になる
半角スペースを別の文字列に変換
System.Console.ReadLine().Replace(" ","YES");
出力結果
1YES2YES3YES4YES5
改行して分けているパターン
Cランクから出てくる気がする。
入力値
1 2 3 4 5
6 7 8
改行したあとの値も必要の場合
// 取得方法を変える
var line_input = System.Console.In.ReadToEnd();
System.Console.WriteLine(line_input);
出力結果
1 2 3 4 5
6 7 8
改行コードと空白がいらない場合
var line_input = System.Console.In.ReadToEnd().Replace(" ", "").Replace("\n", "");
出力結果
出力結果 > 12345678
↑追記
こんなことしなくても普通にReadLineを二つ宣言すればとってくれた、泣いた
var line1 = System.Console.ReadLine().Trim();
var line2 = System.Console.ReadLine().Trim();
出力値
1 2 3 4 5
6 7 8
↑追記
入力値の行数が不定の場合は、こう対処するらしい
いよいよReadToEndの立場がなくなってきた…
// timesは行数が入力値で与えられているのを取得する
var times = int.Parse(Console.ReadLine());
for (var i = 0; i < times; i++)
{
// for文ぐるぐるで標準入力ピコピコして配列に入れ込んでいる
string[] inputs = Console.ReadLine().Split(' ');
}
入力値がいくつやってくるかわからない
for文でぐるぐる回そうにも数がわからないことがある。
そういうときはwhile無限ループを使用する。
while(true)
{
// ここで配列化とか何やらしようとすると例外発生する
var input = System.Console.ReadLine();
// とってみたもののnullだったら無限ループを抜ける
if(input == null)
{
break;
}
// とりあえず配列に入れてみる
var inputs = input.Split(' ');
}
以上。
string→int、char→intの変換は割愛。