飞漫面试问题及解答介绍
飞漫面试问题及解答介绍
1.1 在 Linux 系统中,一个函数库通常中是这样存在的:
lrwxrwxrwx 1 root root 23 3月 8 11:54 libminigui.so
-> libminigui-1.6.so.
lrwxrwxrwx 1 root root 23 3月 8 11:54
libminigui-1.6.so.2 -> libminigui-1.6.so.
-rwxr-xr-x 1 root root 1551241 3月 8 11:54
libminigui-1.6.so.
-rw-r--r-- 1 root root 5278658 3月 8 11:54 libminigui.a
-rwxr-xr-x 1 root root 738 3月 8 11:54 libminigui.la
请问,这些文件的名称都有什么具体含义?
答:以上文件是libminigui的链接库文件,*.a是静态库,*.so .sa为共享库。
1.2 在 vim 中,遇到如下的编辑问题,应该怎么操作?
a) 撤消上一个编辑操作。 u
b) 重复上一个编辑操作。 .
c) 还原被撤消的编辑操作。 ^ R(ctrl+R)
d) 多次重复一组编辑操作。
在命令模式下,按‘qabc’其中‘q’开始记录命令,‘abc’为命令的名字;开始你的操作,按‘q’键结束记录;使用@abc回放刚才记录的命令运用。
e) 把一段文字转换为全部大写。 段落的开头按v },再按shift+U
1.3 请看下面的目录属性,并回答后面的问题。
drwxrwsr-x 7 snig team 4096 4月 8 19:34 minigui
a) 这里的 s 属性有何作用?
set-uid位。当程序执行的时候,会改变执行权限,既设置了set-uid位后程序的执行权限变为文件所有者权限。
b) 属性字段后的数字 7 表示什么?
子目录的个数 包含. ..目录。
2.2 请写出下面代码在 32 位平台上的运行结果,并说明 sizeof 的性质:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char a[30];
char *b = (char *)malloc(20 * sizeof(char));
printf("%d/n", sizeof(a)); // 30
printf("%d/n", sizeof(b)); // 4
printf("%d/n", sizeof(a[3])); // 1
printf("%d/n", sizeof(b+3));1 // 4
printf("%d/n", sizeof(*(b+4)) ); // 1
return 0 ;
}
2.3 请编写一个 C 函数,该函数给出一个字节中被置 1 的位的个数。
int num_1(unsigned char ch)
{
int sum=0;
for(int i=1;i<=8;i++)
sum+=(ch>>i)&0x01?1:0;
return sum;
}
2.4 请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引怠?
int ch_index(char *str,char ch)
{
char *p = str;
while(*str)
{
if(ch == *str) return str - p;
str++;
}
return npos; //定义npos为“不是合法位置”
}
2.5 请编写一个 C 函数,该函数将一个字符串逆序。
char * strrev (char * string)
{
char *start = string;
char *left = string;
char ch;
while (*string++);
string -= 2; //指向最后一个字符
while (left < string)
{
ch = *left;
*left++ = *string;
*string-- = ch;
}
return(start);
}
2.6 请编写一个 C 函数,该函数将给定的一个字符串转换成整数。
long strtol(const char *nptr, int base)
{
const unsigned char *s = (const unsigned char *) nptr;
unsigned long acc;
unsigned char c;
int neg = 0;
do {
c = *s++;
} while (isspace(c)); //略去空格
if (c == '-') //处理'+','-'号
{
neg = 1;
c = *s++;
}
else if (c == '+')
c = *s++;
if ((base == 0 || base == 16) && c == '0' && (*s == 'x' || *s == 'X')) //处理基 16
{
c = s[1];
s += 2;
base = 16;
}
if (base == 0)
base = c == '0' ? 8 : 10;
for (acc = 0; ; c = *s++)
{
if (isdigit(c))
c -= '0';
else if (isalpha(c))
c -= isupper(c) ? 'A' - 10 : 'a' - 10;
else
break;
if (c >= base) break;
acc *= base;
acc += c;
}
if (neg)
acc = -acc;
return acc;
}
2.7 给出演示 2.6 题函数功能的一个简单程序,并请编写对应的 Linux
Makefile 文件。
//test.c 文件
#include <stdio.h>
#include <ctype.h>
int main()
{
int n = strtol("-12345",10);
printf("%d",n);
return 0;
}
#Makefike文件:
test:test.o
gcc –o test test.o
test.o:test.c
gcc –c test.c
或者:
TARGET= test
OBJS= test.o
CC= gcc
CFLAGS= -g -Wall
LIBS= -pthread
OTHE= `allegro-config --libs debug`
${TARGET}:$(OBJS)
$(CC) $^ -g -o $@ $(LIBS) $(OTHE)
3.1 给出 2.3 题的另外一个解法。
使用“查表法”思路。预先定义256个整形的数组,提前完成其索引对应数组值的函数关系,稍后程序中使用该数组,实现如下:
int main()
{
unsigned char i;
int y[256];
memset(y,0,256); //局部变量必须清零
for(i=0;i<256;i++)
y[i] = num_1(i); //num_1()函数是2.3中已经实现的
int n = y[0x45]; //使用y[ ],输出为:n=3
return 0;
}
3.2 请编写一个 C 函数,该函数将给定的整数转换成字符串。
void xtoa (unsigned long val,char *buf,unsigned radix,int is_neg)
{
char *p; /* pointer to traverse string */
char *firstdig; /* pointer to first digit */
char temp; /* temp char */
unsigned digval; /* value of digit */
p = buf;
if (is_neg) {
/* negative, so output '-' and negate */
*p++ = '-';
val = (unsigned long)(-(long)val);
}
firstdig = p;