Есть ли функция C для сравнения строки с таблицей символов? - PullRequest
2 голосов
/ 20 апреля 2020

В языке IBM REXX есть функция VERIFY , которая выполняет то, что я ищу:

Имеется две строки: строка и ссылка :

возвращает число, которое по умолчанию указывает, состоит ли строка только из символов из ссылка ; возвращает 0, если все символы в строке находятся в ссылке , или возвращает позицию первого символа в строке , а не в ссылка .

Например, я хочу найти строку, чтобы убедиться, что только содержит гласные:

str = "foo bar"        /* search string                     */
ref = "aeiou"          /* reference string                  */
loc = VERIFY(str, ref) /* "1" (in REXX, indexes start at 1) */

Есть ли C функция, которая будет это делать? Все, что я смог найти, - это ручное тестирование каждого символа (много ИЛИ) в al oop.

1 Ответ

3 голосов
/ 20 апреля 2020

Да, функция strspn() будет делать то, что вы хотите. Детали немного отличаются от REXX VERIFY, но вы можете использовать его для выполнения тех же тестов.

В частности, strspn() вычисляет длину начального сегмента тестовой строки, которая состоит из символов из указанного набора , Это дает вам (основанный на нуле) индекс первого символа, не входящего в набор, или длину строки (которая является индексом его терминатора), если вся строка состоит из символов из указанного набора. Обратите внимание, что значение 0 возвращаемого значения обязательно отличается. Для strspn() это означает, что символа с индексом 0 нет в наборе (или, как особый случай, что входная строка пуста).

Вы можете легко определить, является ли вся строка состоит из символов из набора тестов, взглянув на значение символа в возвращенном индексе:

char *str = "foo bar";          /* search string                     */
size_t loc;

loc = strspn(str, "aeiou");       // returns 0
printf("%d\n", (str[loc] == 0));  // prints  0

loc = strspn(str, "abfor");       // returns 3
printf("%d\n", (str[loc] == 0));  // prints  0

loc = strspn(str, " abfor");      // returns 7
printf("%d\n", (str[loc] == 0));  // prints  1
...