使用 String.ToUpper() 时程序退出;在其中有空格的字符串上

Program exiting when using String.ToUpper(); on a string that has spaces in it

让我先说我是 C# 的新手。

我目前正在制作我的第一个命令行应用程序,它在当前状态下可以做两件事。其中一个是计算器,我需要更多的学习才能真正使用它,另一个是字符串大写器。

我有一个 string nameCapInput = Console.Readline() 接收用户输入,然后对其进行分析以确保不允许输入任何数字:

using System;
using System.Linq;

namespace First_Console_Project
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("My first ever console application - 2020/2/26\n\n\n");
        programSel:
            Console.WriteLine("What do you want to do?\n");
            Console.WriteLine("1. Calculate Numbers \n2. Capitalize Letters/Strings");
            Console.WriteLine("Input your desired action:");
            var inputVar = Console.ReadLine();
            switch (inputVar)
            {
                case "1":
                    //Calculator code goes here
                    Console.WriteLine("Number 1 succeeded, opening calculator... Stand by");
                    Console.WriteLine("Calulator Loaded.");
                    Console.WriteLine("Doesn't work right now. Type \"exit\" to get back to the \"what do you want to do\" page.");
                    //Code goes here when I have learned the proper methods
                calcInput:
                    var calcInput = Console.ReadLine();
                    if (calcInput == "exit")
                    {
                        goto programSel;
                    } else
                    {
                        Console.WriteLine("Unknown command. Type \"exit\" to get back to the \"what do you want to do\" page.");
                        goto calcInput;
                    }
                case "2":
                    Console.WriteLine("Loading string capitalizer...");
                    Console.WriteLine("Type any string made of letters only without spaces, because if you use spaces, the program will exit. The output will make them all uppercase. Type \"exit\" to get back to the \"what do you want to do\" page.");
                inputCap:
                    string nameCapInput = Console.ReadLine();
                    bool containsInt = nameCapInput.Any(char.IsDigit);
                    bool isMadeOfLettersOnly = nameCapInput.All(char.IsLetter);
                    if (nameCapInput == "exit")
                    {
                        goto programSel;
                    }
                    else if (containsInt)
                    {
                        Console.WriteLine("You can't capitalize numbers. Use letters only. Try again.");
                        goto inputCap;
                    }
                    else if (isMadeOfLettersOnly)
                    {
                        string upper = nameCapInput.ToUpper();
                        Console.WriteLine($"The uppercase version of your entered text is: {upper}");
                        goto inputCap;
                    }
                    break;
                    }
            }
        }
}

现在,一切正常,它会将我放入其中的所有内容都大写 除了 带有空格的字符串。当我输入一个包含空格的字符串时,程序以代码 0 退出。我还不是很擅长 C#,所以我真的不知道从这里去哪里。感谢任何帮助。

每次我在 C# 中学习新东西时,我都会尝试将其实施到我的项目中,这样我就可以实际学习如何实施它以了解何时以及如何使用我所学的知识。这是一个例子。

编辑:添加了其余代码。 非常感谢大家。我在这里学到了两件事:

  1. goto是个坏习惯
  2. 绝对需要开始学习调试我自己的代码。

查看文档:https://docs.microsoft.com/en-us/dotnet/api/system.char.isletter?view=netframework-4.8

根据 IsLetter 函数的文档,space 不包含在 return 个真实案例中。

我建议您为此使用正则表达式或将最后一个案例更改为

else if (!containsInt)
{
    var upper = nameCapInput.ToUpper();
    Console.WriteLine($"The uppercase version of your entered text is: {upper}");
    goto inputCap;
}

同时查看 goto 的文档:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/goto

The goto statement transfers the program control directly to a labeled statement.

A common use of goto is to transfer control to a specific switch-case label or the default label in a switch statement.

The goto statement is also useful to get out of deeply nested loops.

你不属于这种情况,所以你不应该使用它。

你的问题的症结在于你检查输入是否包含字母(不是空格)。一个简单的解决方法是稍微更改您的 LINQ。

bool isMadeOfLettersOnly = nameCapInput.All(c => char.IsLetter(c) || char.IsWhiteSpace(c));

所以现在输入字母 空格将被视为有效。

此外,您使用 goto 是一个非常糟糕的主意。通常不应该有 任何 理由使用 goto.

要解决此问题,请使用 while 循环和方法:

public static void Main()
{
    bool exit = false;
    do {
        exit = ProcessInput();
    }
    while(!exit);
}

private static bool ProcessInput()
{
    string nameCapInput = Console.ReadLine();

    bool containsInt = nameCapInput.Any(char.IsDigit);
    bool isMadeOfLettersOnly = nameCapInput.All(c => char.IsLetter(c) || char.IsWhiteSpace(c));

    if (nameCapInput.Equals("exit", StringComparison.CurrentCultureIgnoreCase))
    {
        return true; //exiting so return true
    }
    else if (containsInt)
    {
        Console.WriteLine("You can't capitalize numbers. Use letters only. Try again.");
    }
    else if (isMadeOfLettersOnly)
    {
        string upper = nameCapInput.ToUpper();
        Console.WriteLine("The uppercase version of your entered text is: {0}", upper);
    }   
    return false; //no exit, so return false
}

这只是一个快速重构,您可以改进它。

Fiddle here