2016-06-22 20 views
0

私はコミュニティで新しく、私はC#を学んでいます。私はプログラムを書くことを試み、以下の問題に直面した。私はGoogleとここで回答を見つけようとしましたが、運がまだありません。私が "Y"を選択するとエラーが発生します。C#。入力文字列が正しい形式ではありません

私はコードとスクリーンショットを添付しました。お手伝いをしていただけたら、ありがとうございます!


using System; 

namespace YourAge 
{ 
    internal class Age 
    { 
     public static void Main() 
     { 
      DateTime newDataTime = DateTime.Now; 
      Console.WriteLine("So, today is " + "{0}", newDataTime); 

      Console.Write("Do you smoke a cigarettes? Y/N: "); 
      char Y = (char)Console.Read(); 

      if (Char.IsUpper(Y)) 
      { 
       Console.Write("How many cigarettes do you smoke in the day?: "); 
       int cigTotal = Convert.ToInt16(Console.ReadLine()); 

       //cost of one cigarettes 
       float costOneCig = 0.3F; 

       float sumTotal = cigTotal * costOneCig; 
       Console.WriteLine("You are losing every day:{0:C2}", sumTotal); 
      } 
      else 
       //coming soon 

       Console.ReadKey(); 
     } 
    } 
} 

これは、例外がスローされます。

Exception Thrown

+0

あなたは「今日の煙?」質問に答えましたか? – Shaharyar

+0

どのような種類のエラー(*例外*スロー、*不適切な出力*、その他)がありますか? –

+0

「あなたはたばこを吸っていますか?」という答えが大文字で、「Y」か「N」かどうかを確認しているようです。 –

答えて

1

問題は、あなたの代わりにConsole.ReadLine()Console.Read()を使用していることです。

Console.Read()は、標準入力から次の文字のみを読み取ります。一方、Console.ReadLine()は、標準入力ストリームから文字の行全体を読み取り、次の改行に移動します。

「Y」を押して次のコンソール入力に達するときに入力すると、Convert.ToInt16(Console.ReadLine()、コンソールは以前の入力行まで表示されます。

考えられる解決策:

  1. 変更Covert.ToChar(Console.ReadLine())(char)Console.Read()ReadLineはcharではなく文字列全体を取り込むので、文字列の最初の文字をcharに変換するには、単純な(char)キャストの代わりにConvert.ToCharを使用する必要があります。
  2. (char)Console.Read()の後にブランクConsole.ReadLine()を追加して、コンソールに次の行にフラッシュするように指示します。
  3. "Y2"のような次の数字と一緒にあなたのキャラクターを入力してください(私はあなたがやりたいことは間違いありませんが)。
+0

ありがとうございました!それは働いている。 o/ – Thenoblest

+0

選択された答えが実際の例外を解決することとは何の関係もなく、OPのために奇跡的にすべての問題を解決するのは面白いです。 :) – pijemcolu

+0

私はまだ彼らが来るように問題を解決する、私はあなたの選択を試みたが、例外を解決するのに役立たなかった。私は経験がほとんどないので、外からは面白いようです。どんな場合でもありがとうございます。 – Thenoblest

0
string userInput = Console.ReadLine(); 
int numberOfCigarettes = Convert.ToInt16(userInput); 

これが問題である何のためにそれをより見やすくすることがあります。

Console.ReadLine()は、後で整数に変換する必要がある文字列を返します。 userInput文字列が数値でない場合、変換は不可能であり、例外がスローされます。

一方、if文も正しくありません。今では、変数yをチェックするのは、リテラル文字 'y'を保持するかどうかではなく、大文字であるかどうかだけです。

次の例のように、変数Yは常にこのよう大文字されていることを確認することができます:

if(Y.ToUpper().Equals('Y')) 
0

このようなことを試して問題を診断できます。正しい場合は、必ずマークを付けてください。

Console.Write("Do you smoke a cigarettes? Y/N: "); 
    string answer = Console.ReadLine(); 
    while (answer.Length != 1) { 
     Console.WriteLine("Character is one letter silly."); 
     Console.Write("Do you smoke a cigarettes? Y/N: "); 
     answer = Console.ReadLine(); } 

    char response = answer[0]; 

    if (response == 'Y' || response == 'y') 
    { 
     //YES RESPONSE 
    } 
    else 
    { 
     //NO RESPONSE 
    } 

    Console.ReadLine(); 

このコードは、他の文字よりも他のあなた何も入力かどうかを知るようになります。 C#で幸運を祈る!

+0

ありがとう!試してみます – Thenoblest

関連する問題