преобразование ASCII в Int - PullRequest
       1

преобразование ASCII в Int

4 голосов
/ 25 ноября 2010

gcc 4.5.1 c89

У меня есть буфер, который заполнен символами char.Мне нужно сравнить их:

Это пример содержимого буфера:

vote buffer [ 51 ]
vote buffer [ 32 ]
vote buffer [ 49 ]
vote buffer [ 32 ]
vote buffer [ 50 ]
vote buffer [ 32 ]
vote buffer [ 53 ]
vote buffer [ 32 ]

Я пытаюсь получить int-эквивалент этих символов, находящихся в буфере, для сравнения.

#define NUMBER_OF_CANDIDATES 7
if((vote_data.vote_buff[i] > NUMBER_OF_CANDIDATES || vote_data.vote_buff[i] < 1) {
    /* Do something */
}

Как вы можете видеть, это никогда не будет истинным в операторе if, поскольку диапазон намного больше.

Я попытался привести к (int).Тем не менее, это не решило проблему.

Я думаю, я мог бы рассчитать из набора символов ascii.Однако я бы не стал добавлять больше сложности, если бы не мог помочь.

Большое спасибо за любой совет,

Ответы [ 3 ]

5 голосов
/ 29 ноября 2012

Вы можете использовать atoi для преобразования строк в целые числа.Char и int одинаковы в C

int main (int argc, char** argv)
{
 int n=65;


 char* String;

 String="1234";


 printf("String: %s - Integer: %d\n", String, atoi(String));


 printf("int %d is char: %c\n ", n, n);

}
4 голосов
/ 25 ноября 2010

Если вы просто хотите преобразовать отдельные символы в int, вы можете использовать c - '0' (что эквивалентно c - 48). Если вы хотите преобразовать строки из более чем одного символа, используйте sscanf()

2 голосов
/ 25 ноября 2010

Нет ничего встроенного в стандартную библиотеку, чтобы превратить char в int. Это потому, что большинство int не вписывается в char. Однако есть несколько способов превратить строку в int, потому что это гораздо чаще делается. Вы можете легко использовать их, скопировав каждый char в первый элемент массива длины 2 со вторым символом 0 и используя его в качестве входных данных для atoi(), sscanf() или strtol(). (Я бы порекомендовал одну из двух последних в настоящей программе, поскольку они позволяют проверять ошибки.)

char buffer[2] = {0,0};
int i;

for (i = 0; i < vote_count; ++i) {
    int vote;
    buffer[0] = vote_data.vote_buff[i];
    vote = atoi(buffer);
    /* handle vote */
}

Использование значений ASCII и вычитание '0', безусловно, приемлемый вариант. Любой разумный набор символов будет иметь цифры в порядке.

Лучше всего было бы изменить интерфейс, чтобы ваша подпрограмма не получала массив char, а массив int. Внешние интерфейсы программы должны отвечать за дезинфекцию ввода и превращение его в нечто простое в обработке. В настоящее время нет способа легко изменить программу для поддержки более десяти кандидатов. Разрешение входным подпрограммам хранить int s исправляет это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...