c/c++工程师面试题
2017-08-15 15:02
127 查看
1.在网络通讯中,实现把一个int类型的值从服务器传输到另外一个电脑上,需要把一个int类型的变量放入到一个
重点:字节的转换主要是针对整型int进行的,字符型由于是单字节,所以不存在这个问题。
2.下面代码是否有错误,若有,怎么修改?
3.用计算机进行一万次计算,是用单线程还是用多线程,为什么?
如果是单CPU我就选单线程,如果是多CPU我就选择多线程。
原因:单CPU不管你开多少个线程,计算1万次,都得乖乖的在那块CPU上计算1万次,所以单线程反而比多线程效率高,毕竟线程切换需要不少开销,而且程序写起来比较简单;但是如果是多CPU的话,就最好充分利用资源并行运算,着就需要多线程了。
4.删除map容器里面所有大于60的元素
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; } }
相关文章推荐
- 详解指针常量和常量指针(C、C++工程师面试题)
- C++开发工程师面试题
- C/C++研发工程师 面试题
- 什么是预编译?何时需要预编译 (C、C++工程师面试题)
- 高质量的C/C++编程【某市第九研究所嵌入式软件开发工程师面试题】
- C、C++工程师面试题
- C++开发面试题:红鸟网络,C++平台开发工程师
- C++研发工程师实习生面试题整理
- C++工程师面试宝典系列之C/C++经典面试题
- C,C++软件件工程师面试题
- C++工程师面试宝典系列之C/C++经典面试题
- 转 C++面试题
- C++菱形继承面试题
- C/C++常见面试题
- java工程师面试题_2年经验
- C++经典面试题
- C++面试题之a和b交换面试题
- [C++面试题]之预处理、const与sizeof