Обнаружение, если строка является всеми заглавными буквами

Переполнение стека означает, что: переполнение стека. Обычно в программе есть один стек, который содержит переменные и адреса локальной области, куда возвращаться, когда заканчивается выполнение подпрограммы. Этот стек имеет тенденцию быть фиксированным диапазоном памяти где-то в памяти, поэтому он ограничен, насколько он может содержать значения.

Если стек пуст, вы не можете поп, если вы получите стек ошибка переполнения.

Если стек заполнен, вы не можете нажать, если вы получите ошибку переполнения стека.

Таким образом, переполнение стека появляется там, где вы слишком много выделяете стек. Например, в упомянутой рекурсии.

Некоторые реализации оптимизируют некоторые формы рекурсий. Рекурсия хвоста в частности. Рекурсивные подпрограммы хвоста - это форма подпрограмм, в которых рекурсивный вызов появляется как последняя вещь, что делает процедура. Такой рутинный вызов просто сводится к прыжку.

Некоторые реализации заходят так далеко, что реализуют свои собственные стеки для рекурсии, поэтому они позволяют рекурсии продолжать, пока система не исчерпает память.

Самая простая вещь, которую вы могли бы попробовать, это увеличить размер стека, если сможете. Если вы не можете этого сделать, вторая лучшая вещь - посмотреть, есть ли что-то, что явно вызывает переполнение стека. Попробуйте, напечатав что-то до и после вызова в рутину. Это поможет вам узнать провал.

50
задан StubbornMule 16 January 2009 в 21:41
поделиться

9 ответов

Никакая потребность создать новую строку:

bool IsAllUpper(string input)
{
    for (int i = 0; i < input.Length; i++)
    {
        if (!Char.IsUpper(input[i]))
             return false;
    }

    return true;
}

Редактирование: , Если Вы хотите пропустить небуквенные символы ( исходная реализация OP не делает, но его комментарии указывают, что они могли бы хотеть к ):

   bool IsAllUpper(string input)
    {
        for (int i = 0; i < input.Length; i++)
        {
            if (Char.IsLetter(input[i]) && !Char.IsUpper(input[i]))
                return false;
        }
        return true;
    }
92
ответ дан Greg Dean 7 November 2019 в 20:26
поделиться

Мне нравится подход LINQ.

, Если Вы хотите ограничить его все прописные буквы (т.е. никакие пробелы и т.д.):

return input.All(c => char.IsUpper(c));

или использование преобразования группы метода:

return input.All(char.IsUpper);

, Если Вы хотите просто запретить строчные буквы:

return !input.Any(c => char.IsLower(c));

или

return !input.Any(char.IsLower);
75
ответ дан Jon Skeet 7 November 2019 в 20:26
поделиться

Используйте

if (input == input.ToUpper())
7
ответ дан M4N 7 November 2019 в 20:26
поделиться

Простой?

if (input.ToUpper() == input)
{
    // string is all upper
}
55
ответ дан BoltBait 7 November 2019 в 20:26
поделиться

Регулярные выражения приходят на ум. Найденный этим там: http://en.csharp-online.net/Check_if_all_upper_case_string

0
ответ дан PEZ 7 November 2019 в 20:26
поделиться

Если это должно иметь хороший перфект, я предполагаю, что это происходит много. Если так, возьмите свое решение и сделайте это несколько миллионов раз и время это. Я подозреваю то, что Вы имеете, лучше, чем другие решения, потому что Вы не создаете новый собравший "мусор" объект, который должен быть очищен, и Вы не можете сделать копию строки, не выполняя итерации по нему так или иначе.

4
ответ дан Joe 7 November 2019 в 20:26
поделиться

Я преобразовал бы строку во все заглавные буквы (с ToUpper), тогда сравнивают это с оригиналом (использование Equals). Должно быть выполнимым в одной строке кода.

return s.Equals(s.ToUpper())

6
ответ дан Nick 7 November 2019 в 20:26
поделиться

Я думаю следующее:

bool equals = (String.Compare(input, input.ToUpper(), StringComparison.Ordinal) == 0)

будет работать также, и можно удостовериться, что сравнение сделано, не принимая во внимание строковое преобразование регистра (я думаю, что VB.NET игнорирует регистр по умолчанию). O даже используют String.CompareOrdinal(input, input.ToUpper()).

0
ответ дан Leandro López 7 November 2019 в 20:26
поделиться

Удостоверьтесь, что Ваше определение капитализации соответствует.Nets определению капитализации.

ToUpper () в.Net является лингвистической операцией. На некоторых языках правила капитализации не являются прямыми. турецкий язык я известен этим .

// Meaning of ToUpper is linguistic and depends on what locale this executes
// This test could pass or fail in ways that surprise you.
if (input.ToUpper() == input) 
{
    // string is all upper
}

Вы могли использовать

// Meaning of ToUpper is basically 'ASCII' ToUpper no matter the locale.
if (input.ToUpper(CultureInfo.InvariantCulture) == input) 
{
    // string is all upper
}

, можно испытать желание сохранить символ выполнения памяти символьной капитализацией

предостережения MSDN против этого

for(int i = 0; i < input.Length; i++) {
   if(input[i] != Char.ToUpper(input[i], CultureInfo.InvariantCulture)) {
     return false;
   }
}

, вышеупомянутый код представляет ошибку. Некоторые не английские 'буквы' требуют, чтобы два .net символа закодировали (суррогатная пара). Необходимо обнаружить этих пар и использовать для своей выгоды их как единый блок.

Также при исключении информации о культуре для получения лингвистической капитализации Вы представляете ошибку, где в некоторых локалях Ваш домашний алгоритм капитализации варева не соглашается с .net алгоритм для той локали.

, Конечно, ни одно из этого не имеет значения, не будет ли Ваш код никогда выполнять внешние англоязычные локали или никогда не получать не английский текст.

14
ответ дан Ifeanyi Echeruo 7 November 2019 в 20:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: