2012-04-10 13 views
0

Ich versuche festzustellen, ob jedes Zeichen in meiner Zeichenfolge alphanumerisch ist. Mein Compiler hat nicht die Isalnum-Funktion.isalnum äquivalent mit #define

Meine Funktion ist unten und my_struct hat ein Char-Array der Größe 6 (uint8 bom_pn [6]) .... und ja uint8 ist ein 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)); 
} 

Meine Makrodefinition ist unten:

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

Die oben den Fehler wirft "Operandentypen nicht kompatibel sind (" uint8 * "und" int ")"

Wenn ich meine Definition ändern zu dem folgenden kompiliert mein Code und ich bekomme Warnungen.

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

Warnung: „Umwandlung von Zeigern auf kleinere integer“

Meine Frage ist, wie kann ich diese Definition richtig ohne Warnungen erstellen (und offensichtlich richtig überprüfen).

Dank

+0

Hinweis, dass über Ihren Zeiger vs. spitz - Um Probleme zu vermeiden, behandeln Sie keine Gebietsschemas. Warum hat Ihre Umgebung nicht "ctype.h"? – geekosaur

+0

bah, ich wollte nur sagen, zurück (isal .....) – NickG

Antwort

3

Wie gesagt Sie lh->bom_pn ein Array von Bytes ist, die es effektiv ein Zeigermittel.

Wenn Sie es also an isalphanum übergeben, übergeben Sie einen Zeiger und vergleichen ihn mit Literalbytes.

Sie haben zwei Möglichkeiten:

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')) 

Entweder Ihr Problem beheben sollte.

+0

Danke für die Antwort und detaillierte Informationen. lustig, wie es drei verschiedene Lösungen von drei Benutzern gibt :) – NickG

+0

wieder '* (c)> = 'A' && * (c) <= 'Z'' ist OK, wenn der Zeichensatz ASCII ist aber nicht im Allgemeinen OK Fall (zB EBCDIC) – ouah

1

Ändern Sie alle Vorkommen von

lh->bom_pn+i //pointer 

zu

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

Eine Möglichkeit, es zu beheben. Danke – NickG

+0

Ihre Begrüßung :) –

1

Seit bom_pn ist ein Array Sie es als isalphanum(*lh->bom_pn) passieren müssen, isalphanum(*lh->bom_pn+i) etc

+0

... Und eine andere Möglichkeit, es zu beheben. Vielen Dank – NickG