嵌入式Linux C语言面试试题(2)

一.3、分析题。
本题(各5分)。假设下面代码中的变量都是合法变量,调用外部的函数都是正确的。回答

几个问题:
这些代码意图要干什么?
是否有问题?
如果有问题,该如何修改,或者如何避免类似错误发生?
如果没有问题,如果代码有输出,输出是什么?
1、-----------------------------------------------------------

int isvowel (char c)
{
return c=='a'||c=='e'||c=='i'||c=='o'||c=='u';
}

2、-----------------------------------------------------------

while (c=='\t'||c=' '||c=='\n')
c=getc(f);

3、-----------------------------------------------------------

/* 当x=2, y=3, z=? */
if (x==0)
if (y==0)
z=-1;
else
z=x+y;

4、-----------------------------------------------------------

/* 处理网络事件 */
void process_network_code(int x, int y)
{
/* 选择modes_pointer资源 */
switch (line) {
case THING1:
/* 处理异常1#, 使用老的modes_pointer资源 */
doit1();
break;
case THING2:
/* 处理异常2#, 需要重新启动服务 */
if (x == STUFF) {
/* 重新申请modes_pointer资源,没有初始化 */
do_first_stuff();
/* 在这种条件下,有些资源不用重新申请 */
if (y == OTHER_STUFF)
break;
/* 申请剩下的资源,并初始化 */
do_later_stuff();
}
/* 初始化modes_pointer资源 */
initialize_modes_pointer();
break;
default:
/* 处理普通事件, 使用老的modes_pointer资源 */
processing();
}
/* 使用modes_pointer资源,处理事件 */
use_modes_pointer();
}

5、-----------------------------------------------------------

int is_gb2312_char(char c1, char c2)
{
if (c1 >= 0xa1 && c2 >= 0xa1)
return 1;
else
return 0;
}

6、-----------------------------------------------------------

下面x, y的值是多少,有什么问题?
int x = 10, y = 3;
x ^= y;
y ^= x;
x ^= y;
/* x=?, y = ? */

7、-----------------------------------------------------------

int days[]={31,28,31,30,31,30,31,31,30,31,30,31,};
int calendar[12][31];
int (*monthp)[31];
int *dayp;
int i;

memset(calendar, 0, sizeof(calendar));
i = 0;
for (monthp = calendar; monthp < &calendar[12]; monthp++) {
for (dayp = *monthp; dayp < &(*monthp)[31]; dayp++) {
if (dayp - *monthp < days[calendar - monthp]) {
*dayp = i++ % 7 + 1;
}
}
}

8、-----------------------------------------------------------

void printnum(long n)
{
if (n < 0) {
putchar('-');
n = -n;
}

if (n >= 10) {
printnum(n/10);
}

putchar ("0123456789"[n%10]);
}

9、-----------------------------------------------------------

void * memchr(void *pv, unsigned char ch, size_t size)
{
unsigned char *pch = (unsigned char *) pv;
unsigned char *pchEnd = pch + size;

while (pch < pchEnd) {
if (*pch == ch)
return (pch);
pch++;
}

return NULL;
}

10、-----------------------------------------------------------

void * memchr(void *pv, unsigned char ch, size_t size)
{
unsigned char *pch = (unsigned char *) pv;
unsigned char *pchPlant = pch + size;
unsigned char chSave = *pchPlant;

*pchPlant = ch;
while (pch != ch) {
pch++;
}
*pchPlant = chSave;

return ((pch == pchPlant) ? NULL : pch);
}

11、-----------------------------------------------------------

void UnsToStr(unsigned short int u, char *str)
{
char *pch;

assert(u <= 65535);
pch = &str[5];
*pch = '\0';
do {
*--pch = u % 10 + '0';
} while ((u / 10) > 0);

strcpy(str, pch);
}

12、-----------------------------------------------------------

void *memmove(void *pvTo, void pvFrom, size_t size)
{
char *pbTo = (char *)pvTo;
char *pbFrom = (char *)pvFrom;

((pbTo < pbFrom) ? tailmove : headmove) (pbTo, pbFrom, size);
return (pvTo);
}

13、-----------------------------------------------------------

void *memcpy(void *pvTo, void pvFrom, size_t size)
{
char *pbTo = (char *)pvTo;
char *pbFrom = (char *)pvFrom;

while (size-- > 0);
*pbTo++ = *pbFrom++;
return (pvTo);
}

14、-----------------------------------------------------------

#include <stdio.h>

int main(int argc, char *argv[])
{
char s[]="0123456789";
int i = 0;

do {
printf ("%c", i++[s]);
} while(s?1:printf("\n")-1);

return 0;
}

15、-----------------------------------------------------------

int fibonacci(int x)
{
if (x == 1 || x == 2)
return 1;
return fibonacci(x - 2) + fibonacci(x - 1);
}

16、-----------------------------------------------------------

这里有一个程序cdecl.c。写出它的工作流程。写出它的使用方法。
给出一个典型输入用例,记录下它的输出。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwsfwz.html