牛客网练习,某公司校园招聘。MICRO 2016年
第一题: 下面哪个语句无法通过编译? B
if (x>y);
可以通过编译 相当于 if 后面跟了空白语句。
if (x=y) && (x!=0) x+= y;
不可通过编译第四题: 下面代码运行后,变量 total 的结果是? =10
int total = 0;
for (int i = 0, j = 5; total < 10 || j > 3; ++i, --j) {
total += (i + j);
}
第五题: 在使用标准 C 库时, 下面哪个选项使用只读模式打开文件? A
fopen("foo.txt", "r")
fopen("foo.txt", "r+")r+ 意思是可以读可以写,但是文件不存在会报错。
第六题:请问经过表达式a = 5 ? 0 : 1的运算,变量a的最终值是? a=0条件运算符的优先级高于赋值运算符的优先级
第八题:下列程序的打印结果是? xycdBCDchar p1[15]= "abcd",*p2= "ABCD", str[50]= "xyz";
strcpy(str+2,strcat(p1+2,p2+1));
printf("%s",str);char* strcpy(char *dest,char *src);
将从src开始包含'\0'的字符串拷贝到以dest开始的位置,进行覆盖
char* strcat(char *dest,char *src);
将src开始的字符串添加到dest字符串的末尾(覆盖dest的\0")
两者都返回指向dest的指针。第九题: 以下程序的输出结果是? 6789
#include <stdio.h> main()
{
char a[10]={ '1','2','3','4','5','6','7','8','9',0},*p; int i;
i=8;
p=a+i;
printf("%s\n",p-3);
}
C++中'\0'与'0'是不同的,他们都是字符,但是他们的ASCII码是不同的:
'\0' ASCII码值为0,'0' 也可以写成'\0x30' ,ASCII码值为48。
最后一个0是数字0,即代表字符串结束标志‘\0‘。第十题: int a=5,则 ++(a++)的值是? 编译出错.
只有++运算符只能作用于变量,不能作用于一个数,故++5 编译出错。第十三题:在一个请求页式存储管理中,一个程序的页面走向为
4, 3, 2, 1, 3, 5, 4, 3, 2, 1, 5,并采用 LRU 算法。
假设分配给该程序的存储块个数 M 分别为 3 和 4,
则该访问中发生的缺页次数 F 分别是? M=3, F=9 (2) M=4, F=9第十四题: 第一二三范式区别?
第一范式:原子性,字段不可分割
第二范式:没有包含在主键中的列完全依赖于主键,不能只依赖于主键的一部分。
第三范式:不能存在传递依赖第十五题: 下面关于 RSA 算法的描述,不正确的是? C
首先RSA是公钥算法,速度就不会太快。
再者平时的WIFI大都使用AES加密,AES加解密速度当然不会慢。
RSA 的运行速度相比 AES 算法要慢很多,正确
RSA 的安全性依赖于大数分解,正确
TLS/SSL 协议中 RSA 的公钥长度一般为 256 位或 512 位(错,1024位走起)
RSA 是非对称加密算法,正确公钥如何使用?
甲方是信息接受方,甲方创建RSA秘钥对,发送RSA公钥给乙方,自己保留RSA私钥。
乙方创建AES密钥,加密待传送的明文,之后用RSA公钥仅加密该密钥,
为保证效率,RSA公钥仅加密AES的密钥,并且目前AES密钥最长仅256位。
明文后的密文----通过Internet发给---->甲方
甲方用RSA私钥解密AES密钥,再用解密后的AES密钥解密数据密文,得到明文。
第十七题:假设在 n 进制下,567*456=150216 等式成立,n 的值是?首先判断n>10 ,因为 10进制下 567*456 < 150216
然后 各项展开 判断出 n>15 再结合尾数可知 n=18
假设n进制,则有(5*n^2 +6*n+7) * (4*n^2 +5*n+6) = n^5 +5*n^4 +2*n^2 +n+6,
简化以后可以得到
15*n^4 +49*n^3 +86*n^2 +70*n+36=n^5 ,两边同时除以n 5 ,
可以得到15/n+49/n 2 +86/n 3 +70/n 4 +36/n 5 =1;
要让等式成立,n肯定是大于15的,所以选D, n=18 。第十八题: 下列关于网络编程的描述中,错误的是?
一个 Socket 可以绑定多个网卡,正确
客户端和服务器端都可以主动关闭 Socket,正确,发送fin信号
TCP 和 UDP 协议不能绑定同一端口,错误,TCP和UDP是完全独立的两个软件模块,
因此各自的端口号也相互独立,如TCP有一个255号端口,UDP也可以有一个255号端口Socket 支持阻塞模式和非阻塞模式,正确
简单点说:
阻塞就是干不完不准回来,
非组塞就是你先干,我现看看有其他事没有,完了告诉我一声。第二十题: 关于 Linux 系统上同一个程序的多个进程实例共享一个 TCP 监听端口的说法, 哪个不正确? D
每个进程都使用 SO_REUSEPORT 选项,然后绑定同一个地址和端口,正确
每个进程分别绑定不同的网卡地址的同一端口,正确
第一个进程先绑定到监听地址端口, 然后 fork 子进程共享使用,正确
每个进程分别绑定一次, 但只有最后一个调用的进程才能收到数据,错误选项。
解释:确实只有一个进程收到数据,但这是竞争调度的结果,
而不是最后调用的进程收到数据。线程争夺资源,并且对获得资源的优先顺序敏感就会进入竞争状态,
缺点是锁住资源会阻止多线程并发执行。第二十一题: 阅读下面程序,说出几点,程序错误或者不规范的地方。
#include "stdio.h" #include "stdlib.h"
#include "string.h"
//
// 说明:
// checkpwd {username} {password} //
// 程序接收两个参数, 分别是用户名和密码. 然后和本地数据库中的正确值比较, 如果匹配则返回 0,
// 失败则返回-1 //
int main(int argc, char* argv[]) {
char* username = argv[1];
char* password = argv[2];
char* cmd = (char*)malloc(256);
if (strlen(username) == 0 || strlen(password) == 0) return;
//
// mysql 命令行参数说明
// mysql -h {服务器} -u {用户名} -p{密码} {数据库名称}
//
sprintf(cmd, "echo 'SELECT * FROM users WHERE username=%s AND password=%s' | /bin/mysql -h 127.0.0.1 -u root -p123 userdb", password, username);
if (system(cmd) > 0)
return 0;
else
return -1;
}1. argv, 边界未执行边界检查
2.cmd 指针为释放。
3. return 没有跟上返回值
4. sprintf 会有溢出漏洞
5. 明文传输密码
6. root用户访问数据库
7. SQL 语句拼接有注入漏洞
8. 用户名和密码位置写反
9. system 命令执行只要不出错都会返回0,此处应返回sql执行结果,逻辑错误。
10. 失败返回-1,shell会识别成255。