Я создал для этого функцию:
int SIGN_CHECKER (char* x)
{
if(*x == '!')
{
return 1;
} else if(*x == '?')
{
return 1;
} else if(*x == '^')
{
return 1;
} else if(*x == '&')
{
return 1;
} else if(*x == '%')
{
return 1;
} else
{
return 0;
}
}
Но, как вы видите, это не так эффективно, кто-нибудь знает лучший способ? Спасибо
3 ответа
Типичная скорость выполнения по сравнению с оптимизацией использования памяти заключается в создании простой справочной таблицы.
#include <stdbool.h>
int sign_checker (char x)
{
static const bool is_special [256] =
{
['!'] = true,
['?'] = true,
['^'] = true,
['&'] = true,
['%'] = true,
};
return is_special [(unsigned char)x];
}
Машинный код x86 очень эффективен (gcc -O3):
SIGN_CHECKER:
movsx rdi, dil
movzx eax, BYTE PTR is_special.0[rdi]
ret
is_special.0:
.zero 33
.byte 1
.zero 3
.byte 1
.byte 1
.zero 24
.byte 1
.zero 30
.byte 1
.zero 161
Во-первых, объявление параметра функции, имеющего тип char *
, не имеет смысла, поскольку внутри функции проверяется только один символ.
Функция может быть объявлена и определена следующим образом
#include <string.h>
//...
int SIGN_CHECKER( char c )
{
return c != '\0' && strchr( "!?^&%", c );
}
Как видите, внутри функции достаточно написать всего одну строку.
Вы можете попробовать использовать регулярное выражение, например:
#include <regex.h>
#include <stdio.h>
#include <stdlib.h>
int check_pattern(char *string, char *pattern){
regex_t regex;
int res;
// Compile regex
res = regcomp(®ex, pattern, 0);
// if there is error on compiling regex
if (res)
exit(1);
// Execute regex
res = regexec(®ex, string, 0, NULL, 0);
if (!res)
return (1);
else
return (0);
// Free memory
regfree(®ex);
}
Знать передать в функцию строку и специальные знаки в шаблоне регулярного выражения:
int main()
{
// special signs are : "?*-"
printf("%d\n", check_pattern("abc?d", "[?*-]"));
}
Узнайте больше о том, как использовать регулярное выражение в c, из этого статья.
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.
return (strchr("!?^&%", *x) != NULL);
x
является указателем?SIGN_CHECKER
проверяет только первый символ строки?SIGN_CHECKER
, тогда мы сможем рассказать вам больше о том, почему это неправильно.