文章目录
- 1.选择题
- 2.代码题
- 2.1 模拟实现strncat
- 2.2 模拟实现strncpy
- 2.3 编写判断大小端程序
- 2.4 模拟实现atoi
- 2.5 BC38 变种水仙花数
- 2.6 BC98 序列中删除指定数字
今天我们一起来看一些题目
1.选择题
解析如下:
正确选项:B
A.参数错误;D.返回值类型错误。
解析如下:
正确选项:A
B.返回值为int,不是函数指针;
C.返回的函数指针没有设置参数;
D.返回的函数指针没有返回值。
解析如下:
正确选项:C
A,第一个括号定义一个数组,成员是int*,因此后面括号里的int*就很奇怪,四不像;
BD.如果是数组,p只能在[ ]右边;
C.如下图所示。
解析如下:
根据回调函数的定义,可以判别D项错误,正确的描述为回调函数是调用函数指针指向的函数。
回调函数是一种在编程中常见的概念,它是指将一个函数作为参数传递给另一个函数,并在特定的条件或事件发生时被调用执行的函数。
具体来说,回调函数是作为参数传递给其他函数的函数指针或函数对象。当满足特定条件或事件发生时,调用该函数指针或函数对象,以执行预定义的操作或逻辑。
正确选项:C
C项,字符串中没有\0,strlen会继续往后读取直到遇见\0,可能计算出随机值。
正确选项:C
二维数组传参可以省略行,但不能省略列,A项错误;
数组名传参,数组名是数组首元素的地址,如下图,二维数组每一个元素可以看作一维数组,arr[0]地址的类型是int(*arr)[5]
,C项正确。
正确选项:B.D
数组传参,第一种可以传数组,D选项正确。
第二种是数组首元素的地址,数组首元素类型是char*,一级指针char *的地址是二级指针char **,因此B项正确。
也可以是void test(char * arr[ ]);
正确选项:B
如下图所示,ptr被强转为int*,-1后解引用访问一个字节,即1;a+1解引用得到4.
正确选项:A
如下图.
正确选项:C
如下图所示.
正确选项:B
解析如下图所示.
正确选项:A
解析如下图所示.
正确选项:C
解析如下图所示.
正确选项:C
unsigned char取值范围-128~127,a+b=300,以%d打印,结果就是300,因为int是存得下300的;如下图所示,c存不下300,127+1变成-128,127+128+45=300,因此结果是44.
正确选项:C
a的成员为-1,-2,…,-127,128,…,1,0(如上题图)
strlen遇’\0’停止计算,-1,-2,…,-127,128,…,1共255个数。
正确选项:D
是变量名,不是类型名。
正确选项:C
结构体students的内存分布如下所示.
正确选项:D
sizeof是计算大小的.
正确选项:B
.的优先级高于*,因此,B项对p.a解引用,p.a是结构体成员,不能解引用。
正确选项:C
如下图所示,所有成员最大对齐数是4,大小是4的倍数,因此是12.
正确答案:C
如下图所示,A,B的大小分别是16,12.
- 下面代码的结果是:( )
#pragma pack(4)/*编译选项,表示4字节对齐 平台:VS2013。语言:C语言*/
//假设long 是4个字节
int main(int argc, char* argv[])
{
struct tagTest1
{
short a;
char d;
long b;
long c;
};
struct tagTest2
{
long b;
short c;
char d;
long a;
};
struct tagTest3
{
short c;
long b;
char d;
long a;
};
struct tagTest1 stT1;
struct tagTest2 stT2;
struct tagTest3 stT3;
printf("%d %d %d", sizeof(stT1), sizeof(stT2), sizeof(stT3));
return 0;
}
#pragma pack()
A.12 12 16
B.11 11 11
C.12 11 16
D.11 11 16
正确选项:A
如下图所示.
- 有如下宏定义和结构定义
#define MAX_SIZE A+B
struct _Record_Struct
{
unsigned char Env_Alarm_ID : 4;
unsigned char Para1 : 2;
unsigned char state;
unsigned char avail : 1;
}*Env_Alarm_Record;
struct _Record_Struct *pointer = (struct _Record_Struct*)malloc(sizeof(struct _Record_Struct) * MAX_SIZE);
当A=2, B=3时,pointer分配( )个字节的空间。
A.20
B.15
C.11
D.9
正确选项:D
首先分析位段_Record_Struct的大小,如下图所示,共三个字节,3*2+3=9.
2.代码题
2.1 模拟实现strncat
char* my_strncat(char* dest, const char* src, int n)
{
char* p = dest;
while (*p)
p++;
int i = 0;
for (; *src != '\0' && i < n; i++)
p[i] = src[i];
p[i] = '\0';
return dest;
}
2.2 模拟实现strncpy
char* my_strncpy(char* dest, const char* src, int n)
{
int i = 0;
for (; *src != '\0' && i < n; i++)
dest[i] = src[i];
dest[i] = '\0';
return dest;
}
2.3 编写判断大小端程序
写一个函数判断当前机器是大端还是小端,如果是小端返回1,如果是大端返回0.
int check_sys()
{
int i = 1;
return (*(char *)&i);
}
2.4 模拟实现atoi
自行了解库函数atoi的功能,学习使用,并模拟实现atoi函数。
文档链接:atoi - C++ Reference (cplusplus.com)
#include <stdio.h>
#include <ctype.h>
#include <assert.h>
int state = 0;
int my_atoi(const char* str)
{
assert(str!=NULL);
if (*str == '\0')
return 0;
int flag = 1;
while (isspace(*str))
str++;
if (*str == '-')
{
flag = -1;
str++;
}
else if (*str == '+')
str++;
else
;
long long ret = 0;
while (*str!='\0')
{
if (isdigit(*str))
{
ret = flag * (*str - '0') + ret * 10;
if (ret > INT_MAX)
return INT_MAX;
else if (ret < INT_MIN)
return INT_MIN;
else
;
}
else
return (int)ret;
str++;
}
//正常结束
if (*str == '\0')
state = 1;
return (int)ret;
}
int main()
{
printf("%d\n", my_atoi("123"));
return 0;
}
2.5 BC38 变种水仙花数
BC38 变种水仙花数
#include <stdio.h>
int main()
{
for (int i = 10000; i <=99999; i++)
{
int sum = 0;
for(int j=10;j<=10000;j*=10)
sum+=(i%j)*(i/j);
if (sum == i)
printf("%d ", i);
}
return 0;
}
2.6 BC98 序列中删除指定数字
BC98 序列中删除指定数字
#include <stdio.h>
int main() {
int arr[50]={0};
int n,del,j=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&arr[i]);
scanf("%d",&del);
for(int i=0;i<n;i++)
{
if(arr[i]!=del)
{
arr[j]=arr[i];
j++;
}
}
for(int i=0;i<j;i++)
printf("%d ",arr[i]);
return 0;
}