C:奇怪的打印错误?

时间:2012-10-28 03:30:51

标签: c

我不明白这是如何运作的。说我有以下内容:

void print(char* str, int len)
{
    int i = 0;
    for (i=0; i<len; i++)
    {
        if (str[i]=='\0')
            printf(" ");
        else
            printf("%c", str[i]);
    }
    printf("\n\n");
}

char* sym4 = "=";
char str2[strlen(var)+strlen(sym4)];

unsigned long temp1 = 0x00000008;
unsigned char* nTableSize = (unsigned char*)&temp1;

memcpy(str2, var, strlen(var));
memcpy(str2+strlen(var), sym4, 1);
memcpy(str2+strlen(var)+1, nTableSize, 4);

print(str2, 5);
print(str2, 6);

并运行它给出输出:

var=
var

显然出现了问题(加上它弄乱了我的其他程序)。为什么不能将nTableSize正确地复制到str2,以便打印5个字符会产生与6不同的输出?...

1 个答案:

答案 0 :(得分:1)

假设您使用的是x86或x86-64之类的小端架构,则4字节值0x0000008在内存中表示为字节08 00 00 00。您将字节打印为字符,字符8是退格字符'\b'的ASCII。

当您向终端打印\b时,终端驱动程序将光标向后移动一个字符,但它实际上并没有写出任何内容 - 直到您编写下一个字符才会覆盖它以前的角色。

因此,当您打印出5个字节"var=\b"时,它会打印出"var="并将光标留在=符号下。但是当你打印出6个字节"var=\b "时,它会写"var=",将光标向后移动一个,并用空格覆盖=,然后留下"var "。< / p>

如果您将输出重定向到文件而不是打印到终端,则会看到正在打印的原始08字节。