#include <stdio.h>
#include <stdlib.h>
void getxs(char * buf)
{
char c;
char pre1 = 0, pre2 = 0;
int i = 0; n = 0;
c = getchar();
while (1)
{
if (c == 0x20 || c == 0x0A)
{
buf[i] = pre1 * 0x10 + pre2;
pre1 = 0;
pre2 = 0;
}
else
{
if (c >= '0' && c <= '9')
{
if (0 == pre1)
{
pre1 = c - '0';
}
else if (0 == pre2)
{
pre2 = c - '0';
}
else
{
pre1 = pre2;
pre2 = c - '0';
}
}
else if (c >= 'a' && c <= 'f')
{
if (0 == pre1)
{
pre1 = c - 'a' + 10;
}
else if (0 == pre2)
{
pre2 = c - 'a' + 10;
}
else
{
pre1 = pre2;
pre2 = c - 'a' + 10;
}
}
}
c = getchar();
}
for (; n < i; n ++)
{
printf("n:%d; c:%x\n", n, buf[n]);
}
}
int getbuf()
{
#if system == win32
int i = 1;
int buf[2];
#else if system == linux
int buf[2];
int i = 1;
#endif
getxs((char *)buf);
return i;
}
void show()
{
int val;
printf("Please enter Hex:");
val = getbuf();
printf("val = 0x%x\n", val);
}
这个例子中,我们调用getbuf()并打印其返回值,getbuf默认返回1.但是如果我们输入特定的字串则会出现意想不到的结果,比如这里输入:30 31 32 33 34 35 36 37 ef be ad de
结果:val=0xdeadbeef。
这是一个栈的使用问题,当然在不同的系统上还是用差异的。这里我给出了win32和linux的格式。
这里是回答《深入理解计算机系统(第一版)》的例子,因为年代久远,所以只能用这种方式实现,但是在第二版中,这个例子已经被拿掉了,比较可惜。