2014-02-23 57 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