programing

C - char 배열에 char가 있는지 확인합니다.

goodcopy 2022. 7. 27. 22:10
반응형

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

반응형