C - char 배열에 char가 있는지 확인합니다.
문자가 잘못된 문자 목록/배열에 속하는지 확인하려고 합니다.
Python의 배경에서 온 저는 다음과 같이 말할 수 있었습니다.
for c in string:
if c in invalid_characters:
#do stuff, etc
일반 C char 어레이에서는 어떻게 하면 좋을까요?
C 라이브러리의 잘 알려지지 않았지만 매우 유용한(및 '영원한'을 의미하는 C89 이후 표준) 함수는 정보를 한 번의 호출로 제공합니다.실제로 여러 가지 기능이 있습니다.즉, 막대한 부를 창출하는 것입니다.이와 관련된 것은 다음과 같습니다.
7.21.5.3strcspn 함수
개요
#include <string.h> size_t strcspn(const char *s1, const char *s2);
묘사
strcspn 함수는 s1이 가리키는 문자열의 최대 초기 세그먼트의 길이를 계산합니다.이 길이는 s2가 가리키는 문자열이 아닌 문자만으로 구성됩니다.
돌아온다
strcspn 함수는 세그먼트의 길이를 반환합니다.
7.21.5.4strpbrk 함수
개요
#include <string.h> char *strpbrk(const char *s1, const char *s2);
묘사
strpbrk 함수는 s2가 가리키는 문자열에서 s1이 가리키는 문자열의 첫 번째 오카렌스를 찾습니다.
돌아온다
strpbrk 함수는 문자에 대한 포인터를 반환합니다.s1에서 s2의 문자가 발생하지 않으면 늘 포인터를 반환합니다.
이 질문은 '문자열의 각 문자에 대해... 비활성 문자 목록에 있는 경우'에 대해 묻습니다.
이러한 기능을 사용하면, 다음과 같이 쓸 수 있습니다.
size_t len = strlen(test);
size_t spn = strcspn(test, "invald");
if (spn != len) { ...there's a problem... }
또는 다음 중 하나를 선택합니다.
if (strpbrk(test, "invald") != 0) { ...there's a problem... }
어떤 것이 더 좋은지는 당신이 또 무엇을 하고 싶은지에 달려 있다.관련된 것도 있어요.strspn()
경우에 따라서는 도움이 되는 기능(블랙리스트 대신 기능).
동등한 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 문자열입니다(null-terminated).char
어레이를 설정합니다.
입력이 표준 늘 종단 C 문자열인 경우 다음을 사용합니다.
#include <string.h>
char* foo = "abcdefghijkl";
if (strchr(foo, 'a') != NULL)
{
// do stuff
}
한편 어레이가 null로 종단되지 않은 경우(즉, 원시 데이터만 해당)를 사용하여 크기를 지정해야 합니다.
#include <string.h>
char foo[] = { 'a', 'b', 'c', 'd', 'e' }; // note last element isn't '\0'
if (memchr(foo, 'a', sizeof(foo)))
{
// do stuff
}
C 문자열을 처리할 때 strchr 함수를 사용합니다.
const char * strchr ( const char * str, int character );
여기 당신이 하고 싶은 일의 예가 있다.
/* 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;
}
메모리 블록을 처리할 때 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/
너는 원한다
strchr (계속 문자 *s, int c)
문자 c가 문자열에 있는 경우 포인터는 의 위치에 반환됩니다.그렇지 않으면 NULL이 반환되므로 잘못된 문자 목록을 문자열로 사용하십시오.
strchr을 사용하여 문자를 처음부터 검색합니다(끝부터 문자열):
char str[] = "This is a sample string";
if (strchr(str, 'h') != NULL) {
/* h is in str */
}
원래 질문에는 다음과 같은 내용이 다음과 같습니다.
잘못된 문자의 목록/배열에 속하는 문자
다음 중 하나가 아닙니다.
NULL 종단 문자열에 속합니다.
만약 그랬다면,strchr
가장 적절한 답변이 될 것입니다.구조 내에 을 생성하여 " " " 를 사용해야 .strchr
또는 컬렉션의 요소를 수동으로 반복하여 각 요소를 차례로 확인합니다.컬렉션이 작을 경우 선형 검색으로 충분합니다.대규모 컬렉션은 검색 시간을 개선하기 위해 정렬된 배열이나 균형 잡힌 이진 트리 등 보다 적합한 구조가 필요할 수 있습니다.
당신의 상황에 가장 적합한 것을 고르세요.
언급URL : https://stackoverflow.com/questions/1071542/in-c-check-if-a-char-exists-in-a-char-array
'programing' 카테고리의 다른 글
왜 memset은 char가 아닌 int를 사용합니까? (0) | 2022.07.27 |
---|---|
VueJ의 동적 컴포넌트에 소품을 동적으로 전달s (0) | 2022.07.27 |
C의 문자 배열 길이 찾기 (0) | 2022.07.26 |
vuejs는 이 . nextTick을 사용해도 mounted() 후 dom 요소에 액세스할 수 없습니다.chartjs 사용 (0) | 2022.07.26 |
조건부 a href(Vuejs) (0) | 2022.07.26 |