Как сравнить символы в с - PullRequest
0 голосов
/ 26 апреля 2011

У меня есть небольшой проект, который я делаю, который требует сравнения первого байта потока.Проблема заключается в том, что этот байт может быть 0xe5 или любым другим непечатаемым символом, и, следовательно, означает, что эти конкретные данные плохие (считывание их 32 бита за раз).Допустимые символы: AZ, az, 0-9, '.'и космос.

Текущий код:

FILE* fileDescriptor; //assume this is already open and coming as an input to this function.
char entry[33];

if( fread(entry, sizeof(unsigned char), 32, fileDescriptor) != 32 )
{
    return -1; //error occured
}

entry[32] = '\0';  //set the array to be a "true" cstring.

int firstByte = (int)entry[0];

if( firstByte == 0 ){
    return -1;    //the entire 32 bit chunk is empty.
}

if( (firstByte & 0xe5) == 229 ){       //denotes deleted.
    return -1;    //denotes deleted.
}

Итак, проблема в том, что когда я пытался сделать следующее:

if( firstByte >= 0 && firstByte <= 31 ){ //NULL to space in decimal ascii
    return -1;
}

if( firstByte >= 33 && firstByte <= 45 ){ // ! to - in decimal ascii
    return -1;
}

if( firstByte >= 58 && firstByte <= 64 ) { // : to @ in decimal ascii
    return -1;
}

if( firstByte >= 91 && firstByte <= 96 ) { // [ to ` in decimal ascii
    return -1;
}

if( firstByte >= 123 ){ // { and above in decimal ascii.
    return -1; 
}

, это не работает.Я вижу такие символы, как тот, который обозначает черный шестигранный бриллиант с вопросительным знаком внутри него ... Теоретически он должен был позволять только следующие символы: Space (32), 0-9 (48-57), A-Z (65-90), a-z (97-122), но я не знаю, почему он не работаетправильно.

Я даже пытался использовать функции в ctype.h -> iscntrl, isalnum, ispunct, но это тоже не сработало.

Сможет ли кто-нибудь помочь товарищу c новичку в том, что, как я полагаю, является простой проблемой c?Был бы очень признателен!

Спасибо.Martin

1 Ответ

7 голосов
/ 26 апреля 2011

Я не уверен, почему вы приводите его к int. Рассмотрите возможность использования одного из следующих:

if ((entry[0] >= 'A' && entry[0] <= 'Z') ||
    (entry[0] >= 'a' && entry[0] <= 'z') ||
    entry[0] == ' ' || entry[0] == '.')

или

#include <ctype.h>
if (isalnum(entry[0]) || entry[0] == ' ' || entry[0] == '.')
...