-1
//------------------------------------------------------------------------------------------//
//  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」することが想定されています。

4

1 に答える 1

0

これが理由だと思います:

配列全体 (長さ MAX_REM+1、たとえば 0 ~ MAX_REM が有効なインデックス) を null (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()指定した数のバイトを書き込み、null で停止しないため、これは理由ではありません)

EDIT:あなたがそれをしている間、MAX_REMはもっと大きくなければなりません(文字列として2 ^ 32を保持する場合は10 - 2 ^ 64の場合は20にする必要があります)

于 2013-01-30T23:51:50.507 に答える