детский вопрос по Си

Slavaga

Конструкцию типа
if (Key == 0 || Key == 1 || Key == 2 || Key == 3 || Key == 4 || Key == 5 || Key == 6 || Key == 7 || Key == 8 || Key == 9)
{
}
заменить на что-нить более компактное?

Julie16

key <= 9
PS: а вообще lol

bobby

&& key >= 0
!

Julie16

It depends. unsinged int always >= 0

bobby

уговорил

Slavaga

Сорри, описался.
if (Key == '0' || Key == '1' || Key == '2' || Key == '3' || Key == '4' || Key == '5' || Key == '6' || Key == '7' || Key == '8' || Key == '9')
{
}
понятно, что можно сделать что-то вроде
if (Key > аски-код(0) && Key < аски-код(9) )
{
} или в таком духе
Инетерсовало нету ли случайно чего-нить в духе паскалевского IN

Julie16

if ( isdigit( key ) )

bobby

Slavaga

Там не обязательно число может быть. Может стоять произвольный набор символов.

Julie16

if (Key > аски-код(0) && Key < аски-код(9) )
{
}
А вот за такое убивать надо Не единым ASCII жив человек.

Slavaga

AnsiString Symbols = "набор символов"
if(Symbols.Pos(символ)!=0)
полагаю так. Хотя новую перемнную вводить... тоже не хочется

bobby

мама, что такое AnsiString?
это Borland?

korol41

как объявлена переменная Key? с этого нужно было начинать.

Slavaga

Инетерсовало нету ли случайно чего-нить в духе паскалевского IN
Все-таки на вопрос мой так и не ответили.

Slavaga

Я не мама Борланд.

Slavaga

предположим char Key

bobby

ну вот и сделай через .Pos(...)

Vladislav177Rus

char a[10]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
int i;
for(i=0; i<10; i ) if(yourchar == a[ i ]) break;
if(i == 10) printf("Не принадлежит");
Кто страшнее?

Slavaga

ну вот и сделай через .Pos(...)
Не.. уж лучше тогда будет как есть

Slavaga

char a[10]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
int i;
for(i=0; i<10; i ) if(yourchar == a[ i ]) break;
if(i == 10) printf("Не принадлежит");
Кто страшнее?

ладно... проехали.

Dasar


char[] chars = {'0', '1', '2', '3', ..};
const int chars_count = sizeof(chars)/sizeof(chars[0]);
if (std::find(chars, chars chars_count, Key) != chars chars_count)
{
}

sergey_m

> if (std::find(chars, chars chars_count, Key) != chars chars_count)
Ты вообще можешь забыть о плюсах, когда речь о Це?

bastii

просто он предлагает забыть о С

sergey_m

Если для тебя скорость не критична, то можно сделать цикл. Можно сделать как есть, только отформатировать. Можно написать:

switch (Key) {
case '1':
case '2':
case '3':
case '4':
жопа
default:
жопа2
}

sergey_m

> просто он предлагает забыть о С
Модератор должен подавать пример соблюдения правил раздела.

Slavaga

НАРОД! Вы ушли от темы! Посмотрите на вопрос:
Конструкцию типа
if (Key == 0 || Key == 1 || Key == 2 || Key == 3 || Key == 4 || Key == 5 || Key == 6 || Key == 7 || Key == 8 || Key == 9)
{
}
заменить на что-нить более компактное?
Ответ предполагался что-то вроде:
if (Key in ('1','2', ...)
{
}
По ходу ничего такого нету в сях. Ну нету и не надо! Оставлю как есть! У меня эта конструкция встречается в двух местах всего! Просто немного мозолило глаз. А писать МЕГА-классы для этого дела или пользовать свитчом можно конечно, но имеет ли смысл в данной конкретной задаче?!

bastii

ну напиши одну функцию, которая берет произвольное число параметров и смотрит первый в остальных
отцы С, как такое пишется (я уже и забыл как такое делается )

rosali

Именно такое написать нельзя, т.к. функция не будет знать, где ей остановиться

bastii

ок, в конце какой-нибудь 0 или -1

voronina

будет знать, если в первом параметре указать сколько их (см printf) и списки аргументов
может массив и передавать?

rosali

если в первом параметре указать сколько их
И ты сам их будешь пальцем считать? А ошибиться не боишься? Проверить-то тебя некокому будет, устанешь отлаживаться... Уж лучше -1, как Димыч советует, хотя тоже лажа, что -1 никогда не нужен что ли...

voronina

да нормально printf работает. -1 с такимже успехом можно забыть отправить. и с такими же последствиями
от всего страховаться программу не напишешь, не думаю, что в С есть адекватные средства решения этой проблемы,
не думаю что в OOP языках можно решить эту проблему без сильной потери производительности
З.Ы. те же яйца вид сверху.
З.З.Ы. ни кто не гарантирует, что твоей функции вдруг не придет случайный набор байтов в качестве пареметров (если планка памяти, напр. глючит)

Bird_V

Так вроде в С есть штатный метод передачи произвольного числа параметров (va_arg)...
У Подбельского он описан, если надо - вечером запощу.

vovablin

в библиотеки string.h есть метод, который ищет аргумент в строке. Уже не помню какой... поищи найдешь. Есть точно!(сам пользовался).

Slavaga

в библиотеки string.h есть метод, который ищет аргумент в строке. Уже не помню какой... поищи найдешь. Есть точно!(сам пользовался).
Уже было -
AnsiString Symbols = "набор символов"
if(Symbols.Pos(символ)!=0)
полагаю так. Хотя новую перемнную вводить... тоже не хочется

daru

млин... не удержусь...
Изврасченцы!
1) Если нужно проверить, что символ принадлежит некоторому "интервалу":
if(c>='a' && c<='z')
...
Годится в случае любого "нормального" (выражусь: ANSI-совместимого) компилятора.
2) switch, если нужно проверить, что символ принадлежит некоторому фиксированному множеству, но не проходит первый пункт
3) Функция с сигнатурой
int f(int length, char* validSymbolsString если множество символов на этапе компиляции неизвестно.
P.S. Иногда, конечно, могут потребоваться какие-то более витиеватые конструкции... Но явно не автору треда.
P.P.S. А вообще заведение подобного треда, равно как и ответы в нем (особенно функции с переменным числом параметров ) должны караться месяцем исправительно-трудовых работ на жабе (java) imho

Julie16

Блин. Еще один. Ты тред-то вообще прочел? А конкретно посты:
Как же меня заебали всезнайки, которые даже не удосуживаются просмотреть тред...
PS: предлагаю за непросмотр треда перед ответом банить на неделю.

danilov


switch (Key) {
case '1':
case '2':
case '3':
case '4':
жопа
default:
жопа2
}

После первой жопы нужен break (?)

Bird_V

да, иначе будет выполняться и "жопа2".

daru

Ты тред-то вообще прочел? А конкретно посты.
Конечно прочел. Если бы не прочел, то везде примеры кода бы вставил. Если угодно, это была краткая выжимка правильных (imho) ответов. Особенно по третьему пункту (при прочих равных выберу передачу динамического массива char *, а не функцию с переменным числом параметров...) Иначе человеку, задавшему _такой_ вопрос, просто не отличить зерна от плевел.
PS. Остальные замечания оставлю без комментариев как не соответсвующие теме треда. Если есть желание повыяснять со мной отношения, то прошу проследовать в приват.

bastii

А может там предполагается, что break в самой "жопе" будет.

elenangel


char s[]="1234567890";//или что угодно размера n штук по 8 бит
char set[32];
for(int i=0;i<32;i++)set[i]=0;
i=0;
while(s[i]!=0)
{
set[s[i]>>3] = (set[s[i]>>3]) | (1<<(s[i]&0x7;
i++;
}//заполнили типа паскаля множество
//проверяем:
if( (set[Key>>3])& (1<<(Key&0x7
{
то, что нужно
}
P.S. Не бейте за код, я на сях редко пишу
Оставить комментарий
Имя или ник:
Комментарий: