2.71题目(具体在书上P83)(1星)
-
问题A:这段代码错在哪里?
答:得到的结果是unsigned,而并非扩展为signed的结果。 -
问题B:给出函数的正确实现。只能使用左右移和一个减法。
答:使用int,将待抽取字节左移到最高字节,再右移到最低字节即可。int xbyte(unsigned word, int bytenum) { int ret = word << ((3 - bytenum)<<3); return ret >> 24; }
2.87题目(书上P88)(2星)
7.8(1星)
题目:在此题中,REF(x,i)-->DEF(x,k)
表示链接器将任意对模块i中符号x的引用于模块k中符号x的定义相关联。在下面每个例子中,用这种符号来说明链接器是如何解析在每个模块中有多重定义的引用的。如果出现链接时错误(规则1),写“ERROR”。如果链接器从定义中任意选择一个(规则3),那么写“UNKNOWN”。
答:
A.
a)REF(main.1)-->DEF(main.1)
b)REF(main.2)-->DEF(main.2)
B. UNKNOWN
C. ERROR
11.10(2星)
-
HTML文件:
<html> <body> <form name="input" action="cgi-bin/adder" method="get"> Num1: <input type="text" name="num1"/> <br/> Num2: <input type="text" name="num2"/> <br/> <input type="submit" value="Submit"/> </form> </body> </html>
因为提交的表单里面有参数名字(num1=x&num2=y),所以要修改相应的adder.c:
int parseNum(char *s)
{
int i = strlen(s) - 1;
while(i>0 && s[i-1]>=\'0\'&&s[i-1]<=\'9\' )
i--;
return atoi(s+i);
}
int main(void) {
char *buf, *p;
char arg1[MAXLINE], arg2[MAXLINE], content[MAXLINE];
int n1=0, n2=0;
/* Extract the two arguments */
if ((buf = getenv("QUERY_STRING")) != NULL) {
p = strchr(buf, \'&\');
*p = 0;
strcpy(arg1, buf);
strcpy(arg2, p+1);
n1 = parseNum(arg1);
n2 = parseNum(arg2);
}
/* Make the response body */
sprintf(content, "Welcome to add.com: ");
sprintf(content, "%sTHE Internet addition portal.\r\n<p>", content);
sprintf(content, "%sThe answer is: %d + %d = %d\r\n<p>",content, n1, n2, n1 + n2);
sprintf(content, "%sThanks for visiting!\r\n", content);
/* Generate the HTTP response */
printf("Content-length: %d\r\n", (int)strlen(content));
printf("Content-type: text/html\r\n\r\n");
printf("%s", content);
fflush(stdout);
exit(0);
}
11.11(2星)
题目:扩展TINY,以支持HTTP HEAD方法。使用TELNET作为Web客户端来验证你的工作。
想到的办法就是定义一个变量rmtd,表示请求的方法。
在client_error,serve_static和serve_dynamic中添加一个参数mtd,表示方法。如果mtd为HEAD,就只打印头部。 结果如下: