Подтвердить что ты не робот

В C - проверьте, существует ли char в массиве char

Я пытаюсь проверить, принадлежит ли символ к списку/массиву недопустимых символов.

Исходя из фона Python, я имел обыкновение просто сказать:

for c in string:
    if c in invalid_characters:
        #do stuff, etc

Как это сделать с помощью регулярных массивов C char?

4b9b3361

Ответ 1

Эквивалентный код C выглядит следующим образом:

#include <stdio.h>
#include <string.h>

// This code outputs: h is in "This is my test string"
int main(int argc, char* argv[])
{
   const char *invalid_characters = "hz";
   char *mystring = "This is my test string";
   char *c = mystring;
   while (*c)
   {
       if (strchr(invalid_characters, *c))
       {
          printf("%c is in \"%s\"\n", *c, mystring);
       }

       c++;
   }

   return 0;
}

Обратите внимание, что invalid_characters является строкой C, т.е. массив char с нулевым завершением.

Ответ 2

Менее известные, но чрезвычайно полезные (и стандартные, поскольку C89 — значение "навсегда" ) функционируют в библиотеке C, предоставляют информацию в одном вызове. На самом деле, есть несколько функций:— смущение богатства. Для этого важны следующие:

7.21.5.3 Функция strcspn

Сводка

#include <string.h>
size_t strcspn(const char *s1, const char *s2);

Описание

Функция strcspn вычисляет длину максимального начального сегмента строки на которое указывает s1, который целиком состоит из символов не из строки, на которую указывает s2.

Возвращает

Функция strcspn возвращает длину сегмента.

7.21.5.4 Функция strpbrk

Сводка

#include <string.h>
char *strpbrk(const char *s1, const char *s2);

Описание

Функция strpbrk находит первое вхождение в строке, на которую указывает s1 любого символ из строки, на которую указывает s2.

Возвращает

Функция strpbrk возвращает указатель на символ или нулевой указатель, если нет символа из s2 встречается в s1.

Вопрос задает "для каждого char в строке... если он находится в списке недопустимых символов".

С помощью этих функций вы можете написать:

size_t len = strlen(test);
size_t spn = strcspn(test, "invald");

if (spn != len) { ...there a problem... }

Или:

if (strpbrk(test, "invald") != 0) { ...there a problem... }

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

Ответ 3

Предполагая, что ваш вход является стандартной строкой C с нулевым завершением, вы хотите использовать strchr:

#include <string.h>

char* foo = "abcdefghijkl";
if (strchr(foo, 'a') != NULL)
{
  // do stuff
}

Если, с другой стороны, ваш массив не заканчивается на нуль (т.е. просто необработанные данные), вам нужно будет использовать memchr и укажите размер:

#include <string.h>

char foo[] = { 'a', 'b', 'c', 'd', 'e' }; // note last element isn't '\0'
if (memchr(foo, 'a', sizeof(foo))
{
  // do stuff
}

Ответ 4

используйте функцию strchr при работе со строками C.

const char * strchr ( const char * str, int character );

Вот пример того, что вы хотите сделать.

/* strchr example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char invalids[] = "[email protected]<>#";
  char * pch;
  pch=strchr(invalids,'s');//is s an invalid character?
  if (pch!=NULL)
  {
    printf ("Invalid character");
  }
  else 
  {
     printf("Valid character");
  } 
  return 0;
}

Используйте memchr при работе с блоками памяти (как массивы с нулевым завершением)

const void * memchr ( const void * ptr, int value, size_t num );

/* memchr example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char * pch;
  char invalids[] = "@<>#";
  pch = (char*) memchr (invalids, 'p', strlen(invalids));
  if (pch!=NULL)
    printf (p is an invalid character);
  else
    printf ("p valid character.\n");
  return 0;
}

http://www.cplusplus.com/reference/clibrary/cstring/memchr/

http://www.cplusplus.com/reference/clibrary/cstring/strchr/

Ответ 5

Вы хотите

strchr (const char * s, int c)

Если символ c находится в строке s, он возвращает указатель на местоположение в s. В противном случае он возвращает NULL. Поэтому просто используйте свой список недопустимых символов в качестве строки.

Ответ 6

strchr для поиска char с начала ( strrchr с конца):

  char str[] = "This is a sample string";

  if (strchr(str, 'h') != NULL) {
      /* h is in str */
  }

Ответ 7

Я считаю, что исходный вопрос сказал:

символ принадлежит списку/массиву недопустимые символы

и не:

принадлежит строке с нулевым завершением

который, если бы это было так, то strchr действительно был бы наиболее подходящим ответом. Если, однако, нет нулевого окончания для массива символов или если символы находятся в структуре списка, тогда вам нужно либо создать строку с завершающим нулем, либо использовать strchr, либо вручную перебрать элементы в коллекции, проверяя каждый по очереди. Если коллекция небольшая, то линейный поиск будет в порядке. Большей коллекции может потребоваться более подходящая структура для улучшения времени поиска - отсортированный массив или сбалансированное двоичное дерево, например.

Выберите, что лучше всего подходит для вас.