2011-02-08 2 views
1

Я работаю над BCD (двоичным кодированным десятичным разрядом) в C и отвечает за запись различных функций bcd.BCD (двоичное кодированное десятичное число) в C

Мне нужно кодировать целое число i в буфер char * s размера n. Функция возвращает 0 при успехе или -1 в случае переполнения (для кодирования i требуется буфер больше n).

Вот функция: int bcd_encode(int i, int n, char *s)

и образец ввода: assert(bcd_encode(a, 128, s) == 0);

Я пишу код для функции bcd_encode и поправьте меня, если я ошибаюсь, но я верю в функции и только в если у вас должно было быть func(char x[]) и char func(char *x) они были бы такими же? Таким образом, вы можете рассматривать оба из них как массив символов. Если бы это было вне определения функции, то char x[]; был бы массивом символов, а char *x; - указателем.

int bcd_encode(int i, int n, char *s){ 
    int j = 0; 
    s = itoa(i, s, n+1); 
} 

Но это возвращает предупреждение «назначение делает указатель из целого числа без приведения» и неопределенного символа itoa. Я пробовал несколько разных вариантов:

* s = itoa (i); s = itoa (i); s = itoa (i, s, n + 1);

Любая помощь будет оценена по достоинству. Заранее спасибо!

+0

Может быть, вы хотите вернуть 'int' в конце функции? – Peyman

+1

'itoa' является только MSVC++ (AFAIK). Это не стандарт C. –

+1

Это не стандарт C, но он широко применяется. – payne

ответ

1

Вы сказали:

... и поправьте меня, если я ошибаюсь, но я верю в функции и только в функции, если вы должны были иметь некоторую FUNC (символ х []) и обугленный FUNC (char * x), они будут одинаковыми? Таким образом, вы можете рассматривать оба из них как массив символов. Если это было вне определения функции char x []; будет char char и char * x; будет указателем.

Было бы лучше, чтобы рассматривать их как в качестве указателей (а не как в массивах) внутри функции, но у вас есть ключевой момент - в списке аргументов функции, различие между массивами и указателями размыты, но в других местах указатели и массивы различны.

В коде, поскольку предполагается, что itoa() возвращает целое число в отсутствие информации об обратном, вы не можете сохранить это в указателе или в качестве указателя (без использования броска кувалды, который оставил бы ваш код сломанным) ,

Что делает itoa() возвращение? Это не стандартная функция C (как, например, в ISO/IEC 9899: 1999, ни в POSIX).Wikipedia предполагает, что он не возвращает значения, поэтому вы не должны присваивать его значение в любом месте. Linux имеет нестандартное расширение в <stdlib.h> с другим интерфейсом, который возвращает char * (что является значением его второго аргумента). Вы можете смело игнорировать возвращаемое значение; на самом деле, вы также можете выполнить назначение (после включения заголовка), но назначение - нет-op. Вам нужно знать, что функция нестандартная, что она имеет множество определений, и поэтому вы должны знать, что правильно для вашей платформы, или не использовать ее (возможно, используя вместо этого snprintf()).


Цитируя страницу руководства, связанный Linux:

char* itoa (int __val, char * __s, int __radix) 

Преобразование целого числа в строку.

Функция itoa() преобразует целочисленное значение из val в представление ASCII, которое будет храниться в s. Вызывающий отвечает за обеспечение достаточного хранения в s.

Примечание:
Минимальный размер буфера с зависит от выбора системы счисления. Например, если радиус равен 2 (двоичный), вам необходимо предоставить буфер с минимальной длиной 8 * sizeof (int) + 1 символ, то есть один символ для каждого бита плюс один для ограничителя строк. Использование большего радиуса потребует меньшего минимального размера буфера. Предупреждение:
Если буфер слишком мал, вы рискуете переполнением буфера. Преобразование выполняется с использованием основания в качестве основания, которое может быть числом от 2 (двоичное преобразование) и до 36. Если радиус больше 10, следующей цифрой после «9» будет буква «a».

Если radix равен 10, а val отрицательный, знак минус будет добавлен.

Функция itoa() возвращает указатель, переданный как s.

Вы не хотите использовать n+1 в качестве основы.

+0

Ahh thx для исправления меня в этой первой части. Я верю 'itoa()' для возврата значения char. – Grant

+0

Вместо того, чтобы верить вещам, найдите их. Вы будете намного счастливее, так как ваши работодатели, коровники и клиенты. –

1
#include <stdlib.h> 

Без этого включают в себя компилятор ничего не говорит о itoa() знать и будет считать, что возвращает int.

+0

hmm У меня был stdio.h не stdlib, но он все еще делает ошибку (так что я буду продолжать копать) – Grant

+0

Это не стандарт C, поэтому местоположение #include может отличаться. См. Документы для вашей системы/компилятора. – payne

0

itoa() не определен, значит, вам не хватает заголовка файла

#include < stdlib.h> 

Если он не определен компилятор принимает неизвестную функцию itoa() возвращает Int (для тупых историческим причинам).

Всегда слушайте предупреждения компилятора - они ваш друг!

+0

Я учился больше слушать ошибки компилятора. Хотя я добавил , он по-прежнему дает мне такую ​​же ошибку ... Я думаю, что это что-то с моим char * s – Grant

+0

, это означает, что у вас нет itoa() - проверьте свои документы компилятора, возможно, у вас есть что-то похожее имя, например. _itoa() –

1

Функция возвращает 0 при успешном завершении или -1 в случае переполнения (для кодирования i требуется буфер больше n).

И все же вы этого не делаете.

int j = 0;

Для чего это?

s = itoa (i, s, n + 1);

Почему вы назначаете s?

Я попробовал несколько различных вариантов от

* з = itoa (I); s = itoa (i); s = itoa (i, s, n + 1);

Попытка случайных действий, пока вы не наткнетесь на то, что работает, не является хорошим подходом к программированию.

Назначение либо s, либо * s здесь неуместно и показывает плохое понимание C; Я настоятельно советую получить больше инструкций на этом языке. После того, как вы сделали это, вы можете использовать snprintf, например,

#include <stdio.h> 
int bcd_encode(int i, int n, char *s){ 
    int r = snprintf(s, n, "%d", i); 
    return r < n? 0 : -1; 
} 

при условии, что S предполагается NUL завершающим и п включает NUL - те детали, которые не указаны в описании.

Кстати, это не то, что «BCD» означает - см http://en.wikipedia.org/wiki/Binary-coded_decimal

+0

+1 для «это не то, что означает BCD». Кто-то должен был это сказать. –

Смежные вопросы