Выход из программы при использовании String.ToUpper (); на строке, в которой есть пробелы - PullRequest
1 голос
/ 27 февраля 2020

Позвольте мне начать с того, что я новичок в 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#, поэтому я не знаю, где отсюда go. Любая помощь приветствуется.

Каждый раз, когда я узнаю что-то новое в C#, я пытаюсь внедрить это в свои проекты, чтобы я мог научиться реализовывать это, чтобы знать, когда и как использовать то, что я изучил , Это пример для этого.

РЕДАКТИРОВАТЬ: Добавил остальную часть кода. Спасибо всем большое. Здесь я усвоил две вещи:

  1. goto - это вредная привычка
  2. Мне абсолютно нужно начать учиться отлаживать свой собственный код.

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Суть вашей проблемы в том, что вы только проверяете, содержат ли ввод буквы (не пробелы). Легко исправить, немного изменив LINQ.

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

Так что теперь ввод с буквами или будет считаться действительным.

Кроме того, использование вами goto очень плохая идея. Как правило, никогда не должно быть любой причин для использования goto.

Чтобы исправить это, используйте while l oop и метод:

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
}

This это просто быстрый рефакторинг, вы могли бы сделать его лучше.

Fiddle здесь

1 голос
/ 27 февраля 2020

Проверьте документацию: https://docs.microsoft.com/en-us/dotnet/api/system.char.isletter?view=netframework-4.8

На основании документации функции IsLetter пробел не включен в возвращаемые истинные случаи.

Я бы посоветовал вам использовать регулярные выражения для этого или изменить свой последний случай на

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

Оператор goto переводит программный элемент управления непосредственно в помеченный оператор.

Обычное использование goto - это передача управления в указанную c метку регистра-переключателя или метку по умолчанию в оператор switch.

Оператор goto также полезен для выхода из глубоко вложенных циклов.

Вы не находитесь ни в одном таком случае, поэтому не следует его использовать.

...