【问题标题】:Program doesn't stop when it's supposed to, and how to I fix this?程序不会在它应该停止的时候停止,我该如何解决这个问题?
【发布时间】:2014-02-23 16:21:01
【问题描述】:

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

这是我的输出:

main函数在内存中的地址为:0x10084a830 main的第一个局部变量在函数栈上的地址为: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                  . . . . . . . . . . 

您可以看到字节在它们应该停止的地方停止,但字符不会。

【问题讨论】:

  • 嗨。对于 SO 问题来说,代码太多了。请将此归结为一个更简单的最小测试用例,该测试用例显示相同的症状。

标签: c char printf


【解决方案1】:

这是你错的地方:

i=i-LINE_WIDTH;

此代码之前的循环不会总是将i 增加LINE_WIDTH,数字可能会更少。你只需要减去你增加的量。

第二部分也是如此

i=i+LINE_WIDTH;

【讨论】:

  • 我也这么认为,但是当我将其更改为 i=i-(LINE_WIDTH-1) 时,会将 i 设置回 0,字节和相应的字符不匹配,现在它们做。 LINE_WIDTH 是一个预定义的常量,这里是 10。
  • 您示例中的尾部为 5 个字节长,LINE_WIDTH 为 10。在第一个周期中,i++; 只会执行 5 次,然后从中减去 10。如果i 落后 5 个字节,您认为您将如何在下一个循环中使用相同的序列?
猜你喜欢
  • 2022-01-15
  • 2019-04-23
相关资源
最近更新 更多