我不明白这是如何运作的。说我有以下内容:
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不同的输出?...
答案 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
字节。