当前位置: 技术问答>linux和unix
下面是一公司给我出的笔试题,有很多人能在60分钟做完吗?
来源: 互联网 发布时间:2015-11-13
本文导语: **********************笔试题目开始********************************* 以下题目请在一个小时内完成。 1、完成字符串拷贝可以使用 sprintf、strcpy 及 memcpy 函数,请问这些函数 有什么区别,你喜欢使用哪个,为什么? Sprintf 和st...
**********************笔试题目开始*********************************
以下题目请在一个小时内完成。
1、完成字符串拷贝可以使用 sprintf、strcpy 及 memcpy 函数,请问这些函数
有什么区别,你喜欢使用哪个,为什么?
Sprintf 和strcpy都是对字符串的拷贝,且前者可以按指定的格式输出,memcpy为对内存的拷贝,一般字符串之外的拷贝只能用memcpy。
我觉得memcpy比较好些,我觉得它更安全,不会出现溢出的情况。
我觉得memcpy比较好些,相对来说它的效率高些。
2、变量的声明和定义有什么区别?
变量的定义是告诉编译器我现在要用这样一个标识(从前没有),并要求其分配一定的内存空间,
而声明是指这个标识已存在,只是要扩大它的使用范围。
变量的定义只能做一次,而声明可做无数次。
3、请写出下面代码在 32 位平台上的运行结果,并说明 sizeof 的性质:
#include
#include
int main(void)
{
char a[30];
char *b = (char *)malloc(20 * sizeof(char));
printf("%dn", sizeof(a));
printf("%dn", sizeof(b));
printf("%dn", sizeof(a[3]));
printf("%dn", sizeof(b+3));
printf("%dn", sizeof(*(b+4)));
return 0 ;
}
结果:
30
4
1
4
1
sizeof计算字节数是和平台相关的
4、请完成以下题目。注意,请勿直接调用 ANSI C 函数库中的函数实现。
a)请编写一个 C 函数,该函数给出一个字节中被置 1 的位的个数,并请
给出该题的至少一个不同解法。
unsigned int TestAsOne0(char log)
{
int i;
unsigned int num=0, val;
for(i=0; i> i;
val &= 0x01;
if(val)
num++;
}
return num;
}
unsigned int TestAsOne1(char log)
{
int i;
unsigned int num=0, val;
for(i=0; i> i;
val &= 0x00;
if(!val)
num++;
}
return num;
}
b)请编写一个 C 函数,该函数将给定的一个字符串转换成整数。
int CharToInt(char* log)
{
int num;
int i;
int n = 1;
int loglen = 0;
char logval[100];
while(log[loglen])
{
loglen++;
if(loglen > 98)
return -1;
}
for(i=0; i>= 1;
}
return cnt;
}
unsigned int TestAsOne1(char log)
{
static int ONECNT[] = { 0, 1, 1, 2 };
int cnt = 0;
return ONECNT[log&0x3] + ONECNT[log>>2&0x3] + ONECNT[log>>4&0x3] + ONECNT[log>>6&0x3];
}
b)请编写一个 C 函数,该函数将给定的一个字符串转换成整数。
// 我假设给出的字符串无误
int CharToInt(char* log)
{
int ret = 0;
while (*log) {
ret = ret*10 + (*log) - '0';
++log;
}
return ret;
}
c)请编写一个 C 函数,该函数将给定的一个整数转换成字符串。
void IntToCharChange(int num, char* pval)
{
char* p = pval;
if (num == 0)
*pval++ = 0;
while (num) {
*pval++ = (num%10) + '0';
num /= 10;
}
*pval-- = '';
while (pval > p) {
char c = *p;
*p = *pval;
*pval = c;
++p;
--pval;
}
}
d)请编写一个 C 函数,该函数将一个字符串逆序。
void AntitoneValue(char* father, char* child)
// 不懂,为什么要2个参数?
e)请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回
该字符所在位置索引值。
unsigned char* FindChar(unsigned long start, unsigned long end, char log)
{
unsigned char* ps = (unsigned char*)start;
unsigned char* pe = (unsigned char*)end;
unsigned char* p;
int idx = -1;
for (p=ps; p maxcnt) {
ret = p;
maxcnt = cnt;
}
cnt = 0;
p = father;
}
prev = *father++;
}
return ret;
}
5、给出演示上述函数功能的一个简单程序,并请编写对应的 Makefile 文件。
(prog.c)
// 不知此题什么意思
Makefile:
a:
gcc prog.c
以下题目请在一个小时内完成。
1、完成字符串拷贝可以使用 sprintf、strcpy 及 memcpy 函数,请问这些函数
有什么区别,你喜欢使用哪个,为什么?
Sprintf 和strcpy都是对字符串的拷贝,且前者可以按指定的格式输出,memcpy为对内存的拷贝,一般字符串之外的拷贝只能用memcpy。
我觉得memcpy比较好些,我觉得它更安全,不会出现溢出的情况。
我觉得memcpy比较好些,相对来说它的效率高些。
2、变量的声明和定义有什么区别?
变量的定义是告诉编译器我现在要用这样一个标识(从前没有),并要求其分配一定的内存空间,
而声明是指这个标识已存在,只是要扩大它的使用范围。
变量的定义只能做一次,而声明可做无数次。
3、请写出下面代码在 32 位平台上的运行结果,并说明 sizeof 的性质:
#include
#include
int main(void)
{
char a[30];
char *b = (char *)malloc(20 * sizeof(char));
printf("%dn", sizeof(a));
printf("%dn", sizeof(b));
printf("%dn", sizeof(a[3]));
printf("%dn", sizeof(b+3));
printf("%dn", sizeof(*(b+4)));
return 0 ;
}
结果:
30
4
1
4
1
sizeof计算字节数是和平台相关的
4、请完成以下题目。注意,请勿直接调用 ANSI C 函数库中的函数实现。
a)请编写一个 C 函数,该函数给出一个字节中被置 1 的位的个数,并请
给出该题的至少一个不同解法。
unsigned int TestAsOne0(char log)
{
int i;
unsigned int num=0, val;
for(i=0; i> i;
val &= 0x01;
if(val)
num++;
}
return num;
}
unsigned int TestAsOne1(char log)
{
int i;
unsigned int num=0, val;
for(i=0; i> i;
val &= 0x00;
if(!val)
num++;
}
return num;
}
b)请编写一个 C 函数,该函数将给定的一个字符串转换成整数。
int CharToInt(char* log)
{
int num;
int i;
int n = 1;
int loglen = 0;
char logval[100];
while(log[loglen])
{
loglen++;
if(loglen > 98)
return -1;
}
for(i=0; i>= 1;
}
return cnt;
}
unsigned int TestAsOne1(char log)
{
static int ONECNT[] = { 0, 1, 1, 2 };
int cnt = 0;
return ONECNT[log&0x3] + ONECNT[log>>2&0x3] + ONECNT[log>>4&0x3] + ONECNT[log>>6&0x3];
}
b)请编写一个 C 函数,该函数将给定的一个字符串转换成整数。
// 我假设给出的字符串无误
int CharToInt(char* log)
{
int ret = 0;
while (*log) {
ret = ret*10 + (*log) - '0';
++log;
}
return ret;
}
c)请编写一个 C 函数,该函数将给定的一个整数转换成字符串。
void IntToCharChange(int num, char* pval)
{
char* p = pval;
if (num == 0)
*pval++ = 0;
while (num) {
*pval++ = (num%10) + '0';
num /= 10;
}
*pval-- = '';
while (pval > p) {
char c = *p;
*p = *pval;
*pval = c;
++p;
--pval;
}
}
d)请编写一个 C 函数,该函数将一个字符串逆序。
void AntitoneValue(char* father, char* child)
// 不懂,为什么要2个参数?
e)请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回
该字符所在位置索引值。
unsigned char* FindChar(unsigned long start, unsigned long end, char log)
{
unsigned char* ps = (unsigned char*)start;
unsigned char* pe = (unsigned char*)end;
unsigned char* p;
int idx = -1;
for (p=ps; p maxcnt) {
ret = p;
maxcnt = cnt;
}
cnt = 0;
p = father;
}
prev = *father++;
}
return ret;
}
5、给出演示上述函数功能的一个简单程序,并请编写对应的 Makefile 文件。
(prog.c)
// 不知此题什么意思
Makefile:
a:
gcc prog.c
|
bt
|
如果你有空把所有str***函数实现一次,然后在做这些根本不算什么。
|
我老板出的bt题目,最高纪录一个面世的哥们面试了17个小时,完了那哥们都快崩溃了,如果是纯技术的题目还好说,净tmd是一些bt的东西
|
难度不大,不过题量也太大了吧?
60分钟我作不完。
60分钟我作不完。
|
楼主高人~