3

私は C# と OOP とスタックオーバーフローに非常に慣れていません。これは私の最初のシナリオです (いくつかの質問)

ピリオド (.) が受信されるまでユーザーに文字を入力してもらい、空白の数を数えて報告してもらいます。

これを達成できますか?(常にヒットしてエンター/リターンを送信するかどうかはわかりません)

文字列を使わずにこれを行うことはできますか? (文字列についてはまだ説明していません。これは自己学習の課題です。したがって、解決策は非常に単純であるはずですが、異常な結果が得られます)。

次のことを試しましたが、最後に a を追加したにもかかわらず、結果が表示される前にプログラムが終了しますConsole.Read();。これは通常は機能します...

class CountSpaces
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Enter characters,finish with a period (\".\"");
            char ch;
            int spaces=0;
            do
            {
                ch = (char)Console.Read();                
                if (ch == ' ')
                {                 
                    spaces++;
                }
            } while (ch != '.');

            Console.WriteLine("Number of spaces counted = {0}",spaces);
            Console.Read();
        }
    }
4

6 に答える 6

4

Console.ReadKey()の代わりに使用しConsole.Read()ます。

  • Console.ReadKey()を呼び出した後、その間にキーが押された場合に戻りますConsole.ReadKey()
  • Console.Read()文字をストリームのように読み取ります(あなたの場合はまったく役に立ちません)。

charで受信したを取得するにはReadKey、次を使用します。ch = Console.ReadKey().KeyChar;

于 2013-01-30T16:37:32.740 に答える
0

コンソールから一連のキーを作成するヘルパーメソッドを作成する場合:

public static IEnumerable<char> ReadKeys()
{
    while (true)
    {
        yield return Console.ReadKey().KeyChar;
    }
}

それは私達があなたが望むものを正確に説明するクエリを書くことを可能にします:

var spaces = ReadKeys()
    .TakeWhile(c => c != '.')
    .Count(c => c == ' ');

ピリオドが出るまで文字を取り、スペースの数を数えます。

于 2013-01-30T16:48:46.723 に答える
0

結果を確認するだけの場合は、代わりに ReadKey を使用します。

class CountSpaces
{
    static void Main(string[] args)
    {
        Console.WriteLine("Enter characters,finish with a period (\".\"");
        char ch;
        int spaces = 0;
        do
        {
            ch = (char)Console.Read();
            if (ch == ' ')
            {
                spaces++;
            }
        } while (ch != '.');

        Console.WriteLine("Number of spaces counted = {0}", spaces);
        Console.ReadKey();
    }
}

ただし、次のように更新すると、プログラムがより面白くなると思います。

class Program
{
    static void Main(string[] args)
    {
        while (true)
        {
            Console.WriteLine("Enter characters,finish with a period (\".\"");
            char ch;
            int spaces = 0;
            do
            {
                ch = (char)Console.Read();
                if (ch == ' ')
                {
                    spaces++;
                }
            } while (ch != '.');

            Console.WriteLine("Number of spaces counted = {0}", spaces);
        }
    }
}
于 2013-01-30T16:42:07.900 に答える
0

私の例では、Console.ReadKey代わりに使用しますConsole.Read

class Program
{
    static void Main(string[] args)
    {
        int spaces = 0;
        char key;
        while ((key = Console.ReadKey().KeyChar) != '.') {
            if (key == ' ')
                spaces++;
        }
        Console.WriteLine();
        Console.WriteLine("Number of spaces: {0}", spaces);
        Console.ReadKey();
    }
}
于 2013-01-30T16:42:14.157 に答える
0

Console.ReadKey()を使用してConsoleKeyInfoを取得します。次に、押されたKeyを確認します。文字を扱う必要はありません:

int spaces = 0;
ConsoleKey key;
do
{
    key = Console.ReadKey().Key;
    if (key == ConsoleKey.Spacebar)
        spaces++;
}
while (key != ConsoleKey.OemPeriod);

Console.WriteLine("Number of spaces counted = {0}",spaces);

NumPad のピリオド キーには値があることに注意してくださいConsoleKey.Decimal。したがって、両方のピリオド キーを処理する必要がある場合は、次の条件を記述する必要があります。

while (key != ConsoleKey.OemPeriod && key != ConsoleKey.Decimal);
于 2013-01-30T16:41:47.413 に答える
0

ReadKeyよりも欲しいRead。後者は、次の文字がストリームに存在する場合はそれを読み取り、存在しない場合は待機しないため -1 を返します (そして、おそらくそれほど速く入力していないでしょう!)

于 2013-01-30T16:38:35.963 に答える