2012-04-10 3 views
0

Я пытаюсь определить, является ли каждый символ в моей строке буквенно-цифровым. Мой компилятор не имеет функции isalnum.isalnum эквивалент с использованием #define

Моя функция ниже, а my_struct имеет массив символов размером 6 (uint8 bom_pn [6]) .... и да uint8 - символ.

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

Мой Макроопределение ниже:

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

выше бросает ошибку "типы операндов несовместимы (" uint8 * "и" INT ")"

Если изменить мое определение к следующему, мой код компилируется, и я получаю предупреждения.

#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

bah, я хотел сказать просто return (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

снова '* (c)> = 'A' && * (c) <= 'Z'' ОК, если набор символов ASCII, но не совсем в общем (например, EBCDIC) – ouah

1

Изменить все вхождения

lh->bom_pn+i //pointer 

к

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

Один из способов исправить это. Спасибо – NickG

+0

Ваш прием :) –

1

Поскольку bom_pn массив нужно передать его как isalphanum(*lh->bom_pn), isalphanum(*lh->bom_pn+i) и т.д.

+0

... И еще один способ исправить это. благодаря – NickG