2012-04-10 2 views
0

문자열의 모든 문자가 영숫자인지 확인하려고합니다. 내 컴파일러에는 isalnum 함수가 없습니다.isalnum equivalent #define

내 기능이 아래에 있고 my_struct의 크기가 6 (uint8 bom_pn [6]) 인 char 배열이 있습니다. 예, uint8은 char입니다.

boolean myfunc(my_struct * lh) 
{ 
ret = (isalphanum(lh->bom_pn) && isalphanum(lh->bom_pn + 1) && 
     isalphanum(lh->bom_pn + 2) && isalphanum(lh->bom_pn + 3) && 
     isalphanum(lh->bom_pn + 4) && isalphanum(lh->bom_pn + 5)); 
} 

내 매크로 정의는 다음과 같습니다 : (가) 위의 오류 "(UINT8 *"와 "INT") "

나는 나의 정의를 변경하는 경우 피연산자 유형이 호환되지 않습니다"를 던졌습니다

#define isalphanum(c) ((c >= '0' && c <= '9') || \ 
         (c >= 'A' && c <= 'Z') || \ 
         (c >= 'a' && c <= 'z')) 

다음에, 내 코드가 컴파일되고 경고 메시지가 나타납니다.

#define isalphanum(c) (((uint8)c >= '0' && (uint8)c <= '9') || \ 
        ((uint8)c >= 'A' && (uint8)c <= 'Z') || \ 
        ((uint8)c >= 'a' && (uint8)c <= 'z')) 

경고 : 내가 제대로 경고없이이 정의를 작성 (분명히 제대로 확인) 어떻게 "작은 정수 포인터의 변환"

내 질문입니다.

감사

+0

참고 포인터 대는 지적을 넘어, 즉 - 문제를 해결하기 위해 로케일을 전혀 사용하지 않습니다. 왜 당신의 환경에는'ctype.h '이 없습니까? – geekosaur

+0

바아, 나는 단지 반환 (isal .....)을 말하려고했다. – NickG

답변

3

당신은 lh->bom_pn이 효과적으로 포인터 의미하는 바이트의 배열입니다 말했듯이.

그래서 isalphanum에 전달하면 포인터를 전달하고이를 리터럴 바이트와 비교합니다.

1)

ret = (isalphanum(lh->bom_pn[0]) && isalphanum(lh->bom_pn[1]) && 
     isalphanum(lh->bom_pn[2]) && isalphanum(lh->bom_pn[3]) && 
     isalphanum(lh->bom_pn[4]) && isalphanum(lh->bom_pn[5])); 

2)

#define isalphanum(c) ((*(c) >= '0' && *(c) <= '9') || \ 
         (*(c) >= 'A' && *(c) <= 'Z') || \ 
         (*(c) >= 'a' && *(c) <= 'z')) 

어느 하나가 당신의 문제를 해결해야합니다

당신은 두 가지 옵션이 있습니다.

+0

응답과 상세한 정보를 제공해 줘서 고마워. 재미있는 세 사용자의 세 가지 다른 해결책이있는 방법 :) – NickG

+0

문자 집합이 ASCII이지만 일반적으로 OK가 아닌 경우 '* (c) <='Z ''는 다시'* (c)> = 'A'&& * (c) 사례 (예 : EBCDIC) – ouah

1

변경 bom_pn 이후

lh->bom_pn[i] //character 
+0

문제를 해결하는 한 가지 방법. 감사합니다 – NickG

+0

귀하의 환영 : –

1

lh->bom_pn+i //pointer 

의 모든 항목은 isalphanum(*lh->bom_pn)로 전달해야 할 배열, isalphanum(*lh->bom_pn+i)

+0

... 그리고 그것을 고칠 수있는 또 다른 방법. 감사 – NickG