程序在它应该的时候不会停止,以及如何解决这个问题?

时间:2014-02-23 16:21:01

标签: c char printf

我必须为学校制作一个程序,我必须将内存打印为字节和字符。问题是,当我输入的数量不是LINE_WIDTH的倍数时,字符流不会在字节流的情况下停止打印。我对两者使用了相同的方法,但我不知道为什么它不起作用。有没有人有想法?

这是代码:

void output(long int *sA, int*dSz)
{
    int i = 0;
    while(abs(i)<abs(*dSz))
    {
        unsigned char* address = (unsigned char*)(*sA);
        if(*dSz>0)
        {
            printf("\n%#lx\t",(*sA+i));
            for(int a=0;a<LINE_WIDTH;a++)
            {
                if(i==*dSz)
                {
                    printf("   ");
                }
                else
                {
                    printf("%.2X ",toupper(address[i]));
                    i++;
                }
            }
            i=i-LINE_WIDTH;
            for(int a=0;a<LINE_WIDTH;a++)
            {
                if(isprint(address[i]))
                    {
                    if(i==*dSz)
                    {
                        exit(0);
                    }
                    else
                    {
                        printf("%c ",address[i]);
                        i++;
                    }
                    }
                else
                    {
                        if(i==*dSz)
                        {
                            exit(0);
                        }
                        else
                        {
                            printf(". ");
                            i++;
                        }
                    }
                }
            }

这是我的输出:

内存中主要功能的地址是:0x10084a830 main的第一个局部变量的地址&lt;&gt;在函数堆栈上是:0x7fff5f3b5ba8

Enter the start address (hex-notation) of dump: 7fff5f3b5ba8

Enter the number of bytes to dump <negative or positive value>: 25

Address     Bytes               Chars
--------    -----------------------------   -------------------
0x7fff5f3b5ba8  A8 5B 3B 5F FF 7F 00 00 E0 5B   . [ ; _ . . . . . [ 
0x7fff5f3b5bb2  3B 5F FF 7F 00 00 01 00 00 00   ; _ . . . . . . . . 
0x7fff5f3b5bbc  00 00 00 00 D0                  . . . . . . . . . . 

正如你所看到的那样,字节停在它们应该的位置,但字符不会。

1 个答案:

答案 0 :(得分:1)

这是你错的地方:

i=i-LINE_WIDTH;

此代码之前的循环并不总是i增加LINE_WIDTH,数字可能会更少。您只需要添加尽可能多的减法。

第二部分与

相同
i=i+LINE_WIDTH;