2014-02-23 61 views
-1

我必须为学校编写一个程序,在这个程序中我必须将内存打印为字节和字符。问题是,当我输入的字符流数量不是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 地址是: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     . . . . . . . . . . 

正如你所看到的字节停止在那里他们应该,但字符没有。

+0

嗨。对于SO问题,这太多了。请将此归结为一个简单的最简单的测试案例,该案例展示了相同的症状。 –

回答

1

这是你错了:

i=i-LINE_WIDTH; 

该代码不是总是LINE_WIDTH增加i之前的周期,数量可能会更少。你只需要减去你添加的那么多。

同去的第二部分与

i=i+LINE_WIDTH; 
+0

我也这么认为,但是当我将它更改为i = i-(LINE_WIDTH-1)时,它会将我设置回0,现在它们的字节和相应的字符不匹配。 LINE_WIDTH是一个预定义的常量,在这里是10. – Sekke91

+0

你的例子中的尾部是5个字节长,LINE_WIDTH是10.在第一个循环中'i ++;'只会执行5次,然后你从中减去10。如果'i'是5个字节后面,你认为在下一个循环中你将使用相同的序列? –

+0

是的,当然,我明白,谢谢! :) – Sekke91