C#でConsole.Read()とConsole.ReadLine()を使用しようとしていますが、奇妙な結果が得られています。たとえば、このコード
Console.WriteLine("How many students would you like to enter?");
int amount = Console.Read();
Console.WriteLine("{0} {1}", "amount equals", amount);
for (int i=0; i < amount; i++)
{
Console.WriteLine("Input the name of a student");
String StudentName = Console.ReadLine();
Console.WriteLine("the Students name is " + StudentName);
}
生徒数に1を入力すると、その金額= 49が返されますが、生徒名を入力する機会すらありません。
これは、文字を読んだからです。 ReadInt32()
のような適切なメソッドを使用して、読み取りシンボルから目的のタイプへの正しい変換を処理します。
_49
_を取得する理由は、これが「1」記号の文字コードであり、not整数表現であるためです。
_char code
0 : 48
1 : 49
2: 50
...
9: 57
_
例:ReadInt32()
は次のようになります。
_public static int ReadInt32(string value){
int val = -1;
if(!int.TryParse(value, out val))
return -1;
return val;
}
_
次のように使用します。
_int val = ReadInt32(Console.ReadLine());
_
_extension method
_を作成できる可能性があるのは本当に素晴らしいことですが、残念ながら静的型で拡張メソッドを作成することはできず、 Console はstatic
型です。
まだこれを必要とするかもしれない誰かのために:
static void Main(string[] args)
{
Console.WriteLine("How many students would you like to enter?");
var amount = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("{0} {1}", "amount equals", amount);
for (int i = 0; i < amt; i++)
{
Console.WriteLine("Input the name of a student");
String StudentName = Console.ReadLine();
Console.WriteLine("the Students name is " + StudentName);
}
}
この方法でコードを変更してみてください
int amount;
while(true)
{
Console.WriteLine("How many students would you like to enter?");
string number = Console.ReadLine();
if(Int32.TryParse(number, out amount))
break;
}
Console.WriteLine("{0} {1}", "amount equals", amount);
for (int i=0; i < amount; i++)
{
Console.WriteLine("Input the name of a student");
String StudentName = Console.ReadLine();
Console.WriteLine("the Students name is " + StudentName);
}
代わりにRead
を使用するにはReadLine
を使用し、次にInt32.TryParse
を使用してユーザー入力が実際に整数であるかどうかを確認します。ユーザーが有効な番号を入力しない場合は、質問を繰り返します。Console.Read
を使用すると、入力が1つの文字に制限され、有効な数値になるように変換して確認する必要があります。
もちろん、これはエラーチェックやループからの安全な中止がない残忍な例です。
intではなくreadから文字char
を取得します。最初にそれを文字列にして、それを文字列として解析する必要があります。実装は次のようになります
Console.WriteLine("How many students would you like to enter?");
var read = Console.ReadLine();
int amount;
if(int.TryParse(read,out amount)) {
Console.WriteLine("{0} {1}", "amount equals", amount);
for (int i=0; i < amount; i++)
{
Console.WriteLine("Input the name of a student");
String StudentName = Console.ReadLine();
Console.WriteLine("the Students name is " + StudentName);
}
}
Readlineは文字列を返すため、readlineを使用するように変更しました。これは、学生の数を任意に9(1桁の最大数)に制限しないためです。
の代わりに:
int amount = Console.Read();
試してください:
int amount = 0;
int.TryParse(Console.ReadLine(), out amount);
これは、文字コードだけを読み取るためです。たとえば、11と入力しても49が得られます。文字列値を読み取り、それをint値に解析する必要があります。上記のコードを使用すると、入力が正しくない場合に0が返されます。
_Console.Read
_は、押されたキー文字のASCII値を返します。
Console.ReadKey().KeyChar
を使用すると、押された実際の文字を表すchar
が得られます。
次に、.ToString()
を使用して、その文字を1文字の文字列に変換できます。
文字列ができたので、_int.Parse
_または_int.TryParse
_を使用して、完全に数字を含む文字列を整数に変換できます。
それで、それをすべてまとめます:
_int value;
if (int.TryParse(Console.ReadKey().KeyChar.ToString(), out value))
{
//use `value` here
}
else
{
//they entered a non-numeric key
}
_
TL; DR; Enter Windowsのキーは1文字ではありません。この事実は、Console.Read()
メソッドに関連する多くの問題の根本にあります。
完全な詳細:コンピューターで以下のコードを実行すると、Console.Read()
の背後にある多くの謎を解くことができます:
_static void Main(string[] args)
{
var c = Console.Read();
Console.WriteLine(c);
c = Console.Read();
Console.WriteLine(c);
}
_
プログラムの実行中に、 Enter キーボードで1回だけキーを押し、コンソールで出力を確認します。以下はその外観です。
興味深いことに、あなたは Enter キーは1回だけですが、コードスニペットで2回のRead()
呼び出しに対応できました。 Enter Windowsのキーは、改行文字に対して2つの文字、つまりキャリッジリターン(_\r
_- ASCII code 13)とラインフィード(_\n
_- ASCIIコード10)。この投稿で詳細を読むことができます--- Windowsのキャリッジリターンは\ r\n 2文字または1文字で構成されていますか?
これを試して:
int amount = ReadInt32();
またはそれが機能しない場合はこれを試してください:
int amount = Console.ReadInt32();
またはこれ:
int amount = Convert.ToInt32(Console.Readline());
この場合、文字列を読み取り、それをInt32値に変換します。
こちらにもアクセスできます: http://www.Java2s.com/Tutorials/CSharp/System.IO/BinaryReader/C_BinaryReader_ReadInt32.htm
何も機能しない場合は、お知らせください。
Console.WriteLine("How many students would you like to enter?");
string amount = Console.ReadLine();
int amt = Convert.ToInt32(amount);
Console.WriteLine("{0} {1}", "amount equals", amount);
for (int i = 0; i < amt; i++)
{
Console.WriteLine("Input the name of a student");
String StudentName = Console.ReadLine();
Console.WriteLine("the Students name is " + StudentName);
}
//thats it
Console.Read()
は、入力した文字の文字コードを返します。文字を文字列として取得するにはConvert.ToChar(amount);
を使用する必要があり、次に、探している値を取得するためにint.Parse()
を実行する必要があります。