#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 Что это делает?
<>
Означает ли это, что ifc
— это символ, который находится до или послеn
?5. Хм … Это означает, что если c не равно ‘n’ . Таким образом, ваш код будет
if (c != 'n') { state = 3;} else {state = 4;}
. Вы еще не узнали о not equals ? (<>
математически не равно .)
Ответ №1:
В C такого синтаксиса нет. Параметры:
-
Используйте
switch
оператор, когда список значений обычно не является непрерывным, или -
Преобразуйте список явных значений символов в непрерывные диапазоны в эквивалентные логические выражения. Как вы знаете, буквенные символы состоят из непрерывного диапазона октетов в 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
}
}
Извините, но я не знаю более эффективного способа.