Укажите диапазон символов в нижнем регистре ASCII в C

#c #c 11

#c #c 11

Вопрос:

Я пишу программу, которая принимает символ и сравнивает его, чтобы увидеть, находится ли он в диапазоне определенных символов. Например, если получаемый символ является символом an n , я перехожу в состояние 3, если это a — m или o — z, я перехожу в состояние 4. Я новичок в C , поэтому я все еще учусь.

Могу ли я сказать что-то вроде:

 char c = file.next_char();
...
if (c in 'a'...'m', 'o'...'z')
{
   state = 3;
} else {
   state = 4;
}
  

Комментарии:

1. «и сравнивает его с с, если он находится в диапазоне определенных символов» ?

2. Да, поэтому, если бы c был чем-то вроде d или t this оценивался бы как true, и я бы перешел в состояние 3, и если я получу n this, это будет false, и я перейду в состояние 4. Поскольку d находится между a и m или t находится между o и z .

3. Да. if (c != 'n') работает нормально.

4. @KenWhite Что это делает? <> Означает ли это, что if c — это символ, который находится до или после n ?

5. Хм … Это означает, что если c не равно ‘n’ . Таким образом, ваш код будет if (c != 'n') { state = 3;} else {state = 4;} . Вы еще не узнали о not equals ? ( <> математически не равно .)

Ответ №1:

В C такого синтаксиса нет. Параметры:

  1. Используйте switch оператор, когда список значений обычно не является непрерывным, или

  2. Преобразуйте список явных значений символов в непрерывные диапазоны в эквивалентные логические выражения. Как вы знаете, буквенные символы состоят из непрерывного диапазона октетов в ASCII, поэтому ваш псевдокод эквивалентен:

     if ( (c >= 'a' amp;amp; c <= 'm')
         ||
         (c >= 'o' amp;amp; c <= 'z'))
      

Ответ №2:

Если вы используете ascii (английский), вы можете положиться на то, что все строчные буквы соседние. Просто проверьте ‘a’ <= c amp;amp; c <= ‘z’ после исключения ‘n’.

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

 // 3 and 4 mean nothing. Give your states meaningful names
enum state_type {FirstState, SecondState, ThirdState, FourthState};

state_type state = FirstState;

char c = get_next_char();
if ('n' == c){
    state = FourthState;
} else if ('a' < c amp;amp; c < 'z'){
    state = ThirdState;
} else {
    // no change?
}
  

Ответ №3:

Возможно, вы могли бы использовать цикл for для сравнения, чтобы определить, находится ли это буква в первом или втором диапазоне. Код будет примерно таким:

     char range1[/*amount in array here*/] = "abcdefghijklmnopqrstuvwxyz";
    //Substitute range on line above(the characters in the string)
    for(int i = 0; i <= /*amount in array here*/; i  ) {
        if(range1[i] == /*nameoflettervariablehere*/){
             //Code here
        }
    }
  

Извините, но я не знаю более эффективного способа.