//------------------------------------------------------------------------------------------//
// divisionAlg -- This will take the incoming value and "asciify" each byte according to
// a character lookup table
//
// Parameters:
// unsigned int value -- the value to be asciified
//
//------------------------------------------------------------------------------------------//
void divisionAlg(unsigned int value);
int main(int argc, char *argv[]) // Always remember to pass an argument while executing
{
divisionAlg(45);
}
void divisionAlg(unsigned int value)
{
int MAX_REM=2;
int MAX_BASE=10;
const char *charTable = {"0123456789ABCDEF"}; // lookup table for converting remainders
char rembuf[MAX_REM + 1]; // holds remainder(s) and provision null at the end
int index; //
int i; // loop variable
unsigned int rem; // remainder
unsigned int base; // we'll be using base 10
ssize_t numWritten; // holds number of bytes written from write() system call
base = 10;
// validate base
if (base < 2 || base > MAX_BASE)
err_sys("oops, the base is wrong");
// For some reason, every time this method is called after the initial call, rembuf
// is magically filled with a bunch of garbage; this just sets everything to null.
// NOTE: memset() wasn't working either, so I have to use a stupid for-loop
for (i=0; i<MAX_REM; i++)
rembuf[i] = '\0';
rembuf[MAX_REM] = 0; // set last element to zero
index = MAX_REM; // start at the end of rembuf when adding in the remainders
do
{
// calculate remainder and divide valueBuff by the base
rem = value % base;
value /= base;
// convert remainder into ASCII value via lookup table and store in buffer
index--;
rembuf[index] = charTable[rem];
} while (value != 0);
// display value
if ((numWritten = write(STDOUT_FILENO, rembuf, MAX_REM + 1)) == -1)
err_sys("something went wrong with the write");
} // end of divisionAlg()
我正在尝试制作一个除法算法而且我不知道为什么不能正常工作,请帮忙!
这个“划分alg”用于获取传入值并根据字符查找表“asciify”每个字节
答案 0 :(得分:0)
我认为这就是原因:
首先将整个数组(长度为MAX_REM + 1,例如0到MAX_REM为有效索引)初始化为空(0x00)。所以rembuf看起来像这样(0x00是ascii null):
'0x00','0x00','0x00','0x00','0x00','0x00',...'0x00','0x00','0x00','0x00'
现在,我们通过执行以下操作将值插入rembuf:
index = MAX_REM;
index--;
rembuf[index] = charTable[rem];
因此,如果我们在12上运行你的算法,那么在循环结束时我们可能会有这样的东西:
'0x00','0x00','0x00','0x00','0x00','0x00',...'0x00','1','2','0x00'
现在打印你这样做:
if ((numWritten = write(STDOUT_FILENO, rembuf, MAX_REM + 1)) == -1)
问题是你传递了它rembuf。当它从rembuf读取时,它立即看到0x00,并决定'这个字符串是空的,我无事可做'。你实际上应该做的是传递一个指针,指向你的号码开始的位置 - '1'在内存中。 (编辑:正如评论所说,write()
写出的字节数与你告诉的一样多,并且不会在空值上停止,所以这不是原因)
编辑:当你在它时,MAX_REM应该更大(对于将2 ^ 32保持为字符串的情况,它需要为10 - 对于2 ^ 64,需要20)