您的位置:首页 > 编程语言 > C语言/C++

c/c++工程师面试题

2017-08-15 15:02 127 查看
1.在网络通讯中,实现把一个int类型的值从服务器传输到另外一个电脑上,需要把一个int类型的变量放入到一个
buffer
中,和从
buffer
中取出一个int变量,要求
buffer
在不同平台之间通过网络传输,获取的
int
类型的数据是一样的,请写出来两种方法,一种为二进制的格式,另外一种为文本格式,要求:调用c的库函数实现;

重点:字节的转换主要是针对整型int进行的,字符型由于是单字节,所以不存在这个问题。

//aData为输入参数,aBuffer为输入参数,指向要写的内存
int WriteIntData(int aData, char *aBuffer)
{
/*C语言标准库中实现这种将十进制数变成二进制表达方式功能的函数:itoa  atoi
itoa()函数有3个参数:第一个参数是要转换的数字,第二个参数是目标字符串,第三
个参数是转移数字时所用 的基数。
在上例中,转换基数为10。10:十进制;2:二进制……*/
_itoa(aData, aBuffer, 10);
return 0;
}

int WriteIntText(int aData, char *aBuffer)
{
/*sprintf的作用是将一个格式化的字符串输出到一个目的字符串中,
而printf是将一个格式化的字符串输出到屏幕。sprintf的第一个参数
应该是目的字符串,如果不指定这个参数,执行过程中出现 "该程序产生
非法操作,即将被关闭...."的提示。
*/

sprintf(aBuffer, "%d", aData);
return 0;
}

//aData为输出参数,存放读出的结果,aBuffer为输入参数,包含所需的数值
int ReadIntData(int *aData, const char *aBuffer)
{
//atoi将字符串转换为int整型
*aData = atoi(aBuffer);
return 0;
}

int ReadIntText(int *aData, const char *aBuffer)
{
sscanf(aBuffer,"%d",aData);
return 0;
}


2.下面代码是否有错误,若有,怎么修改?

(1)
void getmemory(char **p)
{
//问题1.指针类型不匹配,
p = (char *)malloc(100);
//方法1:修改为: *p = (char*)malloc(sizeof(char)*100);
//方法2.char *temp = (char*)malloc(sizeof(char)*100);
//*p = temp;

}

int main()
{
char *str = NULL;
//问题2.函数的参数为二级指针,str为一级指针,应该为str的区地址
getmemory(str);
//修改为:getmemory(&str);

strcpy(str, "hello world");
printf("%s/n", str);
free(str);
return 0;

(2)
int main()
{
char *src = "hello,world";
int len = strlen(src);

char *dest = (char *)malloc(len);
char *d = dest;

//修改为:char *s = src;
char *s = src[len];
while (len-- != 0)
{
//修改为:*d++ = *s++;
d++ = s--;
}
printf("%s", dest);
system("pause");
return 0;
}

(3)
char* GetString(void)
{
char p[] = "hello world.";
return p;
}

//答案:不安全,结果乱码,因为GetString函数中p变量的内存空间是在栈上申请的,该函数运行结束后,p变量所占用的内存空间会被释放,而返回的地址所指向的内存空间中的值是不确定的;

(4)
int main()
{
char *str = "12345";
strcpy(str, "67890");
//运行出错,原因在于str所指向的变量为只读的文字常量区,不能修改;
puts(str);
system("pause");
return 0;
}

(5)
int main()
{
char a[4];
//问题:类型不匹配,修改为:char *str = a;
char *str = &a;
//问题:会出现内存溢出,运行出错
strcpy(str, "hello");
system("pause");
return 0;
}

(6)
int main()
{
char *ptr = "Linux";
//问题:和(4)一样,不能修改只读的常量区的数据,只能进行读操作
*ptr = 'I';
printf("\n[%s]\n", ptr);
system("pause");
return 0;
}


3.用计算机进行一万次计算,是用单线程还是用多线程,为什么?

如果是单CPU我就选单线程,如果是多CPU我就选择多线程。

原因:单CPU不管你开多少个线程,计算1万次,都得乖乖的在那块CPU上计算1万次,所以单线程反而比多线程效率高,毕竟线程切换需要不少开销,而且程序写起来比较简单;但是如果是多CPU的话,就最好充分利用资源并行运算,着就需要多线程了。

4.删除map容器里面所有大于60的元素

void _eraseFunc()
{
map<int, int> mString;
mString.insert(pair<int, int>(1, 50));
mString.insert(make_pair(2, 77));
mString.insert(map<int, int>::value_type(3, 77));
mString[4] = 88;
mString.insert(pair<int, int>(5, 22));

/* 删除map容器>60的所有元素 */
map<int,int>::iterator it1 = mString.begin();
while (it1 != mString.end())
{
if (it1->second > 60)
{
mString.erase(it1++);
//或it1 = mString.erase(it1);
}
else
++it1;
}
cout << "--------------------------" << endl;

/* 遍历map容器元素 */
auto it2 = mString.begin();
for (; it2 != mString.end(); ++it2)
{
cout << it2->first << "," << it2->second << endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: