这些面试题都是自己在面试的时候遇见的,因此总结下来,在以后的面试过程中供大家和自己学习使用。其中的答案是自己通过百度或者自己写出来的,如有错误欢迎指正。
1、逆序输出字符串。
// 逆序输出字符串
char* funReverseStr(char* a)
{
if (!a)
{
return NULL;
}
int len = strlen(a);
char* ret = (char*)malloc(len + 1);
int n = len - 1;
for (int i = 0; i < len; i++)
{
ret[i] = a[n];
n--;
}
ret[len] = '\0';
return ret;
}
2、检测出一个字节中 二进制位1的个数。
// 检测出一个字节中 1的个数
int funCharOneLen(char a)
{
char test[8] = {1, 2, 4, 8, 16, 32, 64, 128};
int len = 0;
char res = a;
for (int i = 0; i < 8; i++)
{
a |= test[i];
if (res != a)
{
a = res;
}
else
{
len++;
}
}
return len;
}
3、如何确定一段程序是C编译程序还是C++编译程序?
// 如果包含的头文件是stdio.h
void JudgeCOrCPP1()
{
#ifdef __cplusplus
printf("C++编译!\n");
#else
printf("C编译!\n");
#endif // __cplusplus
}
// 如果包含的头文件是iostream
void JudgeCOrCPP2()
{
#ifdef __cplusplus
cout << "C++编译!\n";
#else
cout << "C编译!\n";
#endif // __cplusplus
}
4、简述Windows消息机制。
我在网上百度了很多关于这个问题的描述,大部分都是长篇大论,根本不适合面试的时候回答。因为这个问题在笔试中和与面试官的面谈中都遇见过。所以自己简单总结了一下,如有不对或者不完善的地方或者有更好的答案,欢迎补充。
Windows的消息提供了应用程序之间、应用程序与Windows系统之间进行通信的手段。应用程序想要实现的功能由消息来触发,并且靠对消息的响应和处理来完成。
Windows系统中有两种消息队列:系统消息队列和应用程序消息队列。计算机的所有输入设备由Windows监控。当一个事件发生时,Windows先将输入的消息放入系统消息队列中,再将消息拷贝到相应的应用程序消息队列中。应用程序的消息处理程序将反复检测消息队列,并把检测到的每个消息发送到相应的窗口函数中。这便是一个事件从发生至到达窗口函数必须经历的过程。
必须注意的是,消息并非是抢占性的,无论事件的缓急,总是按照到达的先后派对,依次处理(一些系统消息除外),这样可能使一些实时外部事件得不到及时处理。
Windows中的消息是放在对应的进程的消息队列里的。可以通过GetMessage取得,并且对于一般的消息,此函数返回非零值,但是对于 WM_QUIT消息,返回零。可以通过这个特征,结束程序。当取得消息之后,应该先转换消息,再分发消息。所谓转换,就是对键盘码的转换,所谓分发,就是把消息分发给对应的窗口,由对应的窗口处理消息,这样对应窗体的消息处理函数就会被调用。两个函数可以实现这两个功能:TranslateMessage 和DispatchMessage。
5、简述模态与非模态对话框在实现原理上的区别。
面试官问这个问题肯定是不问界面上的差异,而是底层的实现。推荐一篇文章,记得当时就是百度到的这篇,模态与非模态对话框在实现原理上的区别。
6、TCP三次握手与四次挥手。
这个推荐我写的一篇文章,面试:TCP三次握手与四次挥手看这一篇就够了!
7、简述HTTPS协议加密与解密数据的流程。
这个推荐看一篇自认为讲解的很不错的文章,不多解释,写一篇最好懂的HTTPS讲解。
8、用过C++的哪些框架?
这个问题只要是面试稍微大点的公司,被问到的概率还是很大的,刚毕业找工作或者经验比较欠缺的人,往往很难回答好这个问题。所谓框架比如 libcurl、ProtoBuffer、gRPC等等,可以根据自己使用的一些东西去回答。
9、下面代码输出什么?
#include <iostream>
using namespace std;
void print(char* s)
{
if (*s)
{
print(++s);
printf("%c", *s);
}
}
int main()
{
char str[] = "Geneius";
print(str);
getchar();
return 0;
}
// A、suiene B、neius C、run-time error D suieneG
这个问题正确答案应该是A,但是当时面试时我选的是D,面试完回家之后我自己也是想了半天才明白,遇见递归莫名的就有点理不清,现在总算是思路清晰了。首先递归进入函数几次这个是很好确定的,本题进入print函数8次,那么函数肯定返回8次,第一次返回什么都不输出,第二次肯定是输出一个空,第一次啥都不返回比较好理解,第二次得细想一下才能明白输出空,重点在++s上,第三次当然是输出s了,剩下五次就选A了。
10、在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是:
struct A
{
int a;
short b;
int c;
char d;
};
struct B
{
int a;
short b;
char c;
int d;
};
// A、16 16 B、13 12 C、16 12 D、11 16
正确答案应该是选C,下面是关于我总结的字节对齐的一些知识,看不明白可以私信或者评论问。
字节对齐:一个变量占用n个字节,则该变量的起始地址必须是n的整数倍,即:存放起始地址 % n = 0;如果是结构体,那么结构体的起始地址是其最宽数据类型成员的整数倍。
当对空间要求较高的时候,可以通过#pragma pack(n) 来改变结构体成员的对齐方式。#pragma pack(n)中的n用来设定变量以n字节对齐方式,可以设定的值包括:1、2、4、8。若需要取消强制对齐方式,则可用命令#pragma pack()。
如果结构体成员数据类型宽度大于对齐参数,按对齐参数对齐,如果小于对齐参数,则按其自身的数据类型宽度对齐。最后结构体的大小必须是N(N = Min(最大成员, 对齐参数))的整数倍。
写在最后:面试流程
面试流程有好多种,至少我遇见过好多种。有的公司上来就是先给一套笔试题或者一个上机题,做完之后根据你做题的结果再详谈,答题所用的时间和答题的结果都会影响到面试。还有公司没有机试或者笔试,上来就是技术大牛对你问各种问题,这个就看自己的准备是否充分了。当然也有一些公司由于一些原因会先进行电话面试或者视频面试,然后根据谈的结果再进行后续部分。大概面试流程也就这些了,其实说白了就是做笔试题或者上机题或者大牛当面问各种问题,这些问题我们平常工作写代码的时候还总是不是很注意的一些东西,所以面试之前刷题是很有必要的,只有这样面试的时候面对各种问题才会游刃有余。
最后预祝大家找到自己心仪的工作。