W C-sprawdź, czy znak istnieje w tablicy znaków

Próbuję sprawdzić, czy znak należy do listy / tablicy nieprawidłowych znaków.

Pochodząc z tła Pythona, byłem w stanie po prostu powiedzieć:

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

Jak mogę to zrobić ze zwykłymi tablicami znaków C?

Author: Srikar Appalaraju, 2009-07-02

7 answers

Równoważny kod C wygląda następująco:

#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;
}

Zauważ, że invalid_characters jest ciągiem C, tj. tablica zakończona znakiem null char.

 31
Author: RichieHindle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-01 22:26:42

Mniej znane, ale niezwykle użyteczne (i standardowe od C89 - co oznacza "na zawsze") funkcje w bibliotece C dostarczają informacji w jednym wywołaniu. Właściwie, istnieje wiele funkcji-wstyd bogactwa. Odpowiednie do tego są:

7.21.5.3 funkcja strcspn

Synopsis

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

Opis

Funkcja strcspn oblicza długość maksymalnego początkowego odcinka łańcucha wskazywany przez s1, który składa się w całości ze znaków spoza łańcucha wskazywanego przez / s2

Zwraca

Funkcja strcspn zwraca długość segmentu.

7.21.5.4 funkcja strpbrk

Synopsis

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

Opis

Funkcja strpbrk lokalizuje pierwsze wystąpienie w łańcuchu wskazywanym przez s1 dowolnego znak z łańcucha znaków wskazywanego przez s2.

Zwraca

Funkcja strpbrk zwraca wskaźnik do znak, lub wskaźnik null, jeśli nie ma znaku od s2 występuje w s1.

Pytanie pyta o 'dla każdego znaku w łańcuchu ... jeśli znajduje się na liście nieprawidłowych znaków'.

Za pomocą tych funkcji można napisać:

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

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

Lub:

if (strpbrk(test, "invald") != 0) { ...there's a problem... }
To, co jest lepsze, zależy od tego, co jeszcze chcesz zrobić. Istnieje również powiązana funkcja strspn(), która czasami jest przydatna (whitelist zamiast blacklist).
 41
Author: Jonathan Leffler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-03 15:09:57

Zakładając, że twoje wejście jest standardowym zakończonym znakiem null łańcuchem C, chcesz użyć strchr:

#include <string.h>

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

Jeśli z drugiej strony Twoja tablica nie jest zakończona znakiem null (tzn. tylko surowymi danymi), musisz użyć memchr i podaj rozmiar:

#include <string.h>

char foo[] = { 'a', 'b', 'c', 'd', 'e' }; // note last element isn't '\0'
if (memchr(foo, 'a', sizeof(foo)))
{
  // do stuff
}
 23
Author: DaveR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-18 22:08:52

Użyj funkcji strchr podczas obsługi łańcuchów C.

const char * strchr ( const char * str, int character );
Oto przykład tego, co chcesz zrobić.
/* strchr example */
#include <stdio.h>
#include <string.h>

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

Używaj memchr do radzenia sobie z blokami pamięci (jako nie zakończonymi null tablicami)

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
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-01 22:05:38

Chcesz

Strchr (const char *s, int c)

Jeśli znak c znajduje się w łańcuchu s zwraca wskaźnik do lokalizacji w s. W przeciwnym razie zwraca NULL. Więc po prostu użyj listy nieprawidłowych znaków jako ciągu znaków.

 4
Author: Keith Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-01 21:52:12

Strchr do wyszukiwania znaku Od początku (strrchr od końca):

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

  if (strchr(str, 'h') != NULL) {
      /* h is in str */
  }
 2
Author: dfa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-01 21:51:50

Wydaje mi się, że pierwotne pytanie brzmiało:

Znak należy do listy / tablicy invalid characters

A nie:

Należy do łańcucha zakończonego znakiem null

Co, jeśli tak, to strchr rzeczywiście byłoby najbardziej odpowiednią odpowiedzią. Jeśli jednak nie ma zakończenia null dla tablicy znaków lub jeśli znaki są w strukturze listy, musisz utworzyć łańcuch zakończony znakiem null i użyć strchr lub ręcznie iterować elementy w kolekcji, sprawdzając po kolei. Jeśli kolekcja jest mała, wyszukiwanie liniowe będzie w porządku. Duża kolekcja może potrzebować bardziej odpowiedniej struktury, aby poprawić czas Wyszukiwania - na przykład posortowaną tablicę lub zrównoważone drzewo binarne.

Wybierz to, co najlepsze dla Ciebie.
 1
Author: Skizz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-03 14:06:17