0

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

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 不能以打印 5 个字符导致与 6 个不同的输出的方式正确复制到 str2?...

4

1 回答 1

1

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

当您将 a 打印\b到终端时,终端驱动程序将光标向后移动一个字符,但它实际上并没有写出任何内容——直到您写入下一个字符才会导致它覆盖先前存在的字符。

因此,当您打印出 5 个字节"var=\b"时,它会打印出"var="并将光标留在=符号下方。但是,当您打印出 6 个字节"var=\b "时,它会写入"var=",将光标移回一位,并=用空格覆盖 ,留下"var ".

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

于 2012-10-28T03:58:42.537 回答