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?
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
.
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).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
}
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;
}
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.
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 */
}
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.
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