web-dev-qa-db-ja.com

Console.Read()およびConsole.ReadLine()の問題

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が返されますが、生徒名を入力する機会すらありません。

6
Mike Cornell

これは、文字を読んだからです。 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_を作成できる可能性があるのは本当に素晴らしいことですが、残念ながら静的型で拡張メソッドを作成することはできず、 Consolestatic型です。

11
Tigran

まだこれを必要とするかもしれない誰かのために:

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);
     }
}
3

この方法でコードを変更してみてください

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つの文字に制限され、有効な数値になるように変換して確認する必要があります。

もちろん、これはエラーチェックやループからの安全な中止がない残忍な例です。

3
Steve

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桁の最大数)に制限しないためです。

2
Rune FS

の代わりに:

int amount = Console.Read();

試してください:

int amount = 0;
int.TryParse(Console.ReadLine(), out amount);

これは、文字コードだけを読み取るためです。たとえば、11と入力しても49が得られます。文字列値を読み取り、それをint値に解析する必要があります。上記のコードを使用すると、入力が正しくない場合に0が返されます。

0
rumburak

_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
}
_
0
Servy

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 image description here

興味深いことに、あなたは Enter キーは1回だけですが、コードスニペットで2回のRead()呼び出しに対応できました。 Enter Windowsのキーは、改行文字に対して2つの文字、つまりキャリッジリターン(_\r_- ASCII code 13)とラインフィード(_\n_- ASCIIコード10)。この投稿で詳細を読むことができます--- Windowsのキャリッジリターンは\ r\n 2文字または1文字で構成されていますか?

0
RBT

これを試して:

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

何も機能しない場合は、お知らせください。

0
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
0
gerald

Console.Read()は、入力した文字の文字コードを返します。文字を文字列として取得するにはConvert.ToChar(amount);を使用する必要があり、次に、探している値を取得するためにint.Parse()を実行する必要があります。

0
w.brian