1.以下程序的正确运行结果是( )。
int f(int a);
int main(void)
{
int a = 2,i;
for(i = 0; i < 3; i++)
printf("%4d", f(a));
}
int f(int a)
{
int b = 0;
static int c = 3; 第一次:a=2,b=1,c=4 7
b++; 第二次:a=2,b=1,c=5 8
c++; 第三次:a=2,b=1,c=6 9
return (a+b+c);
}
A. 777 B. 7 10 13 C. 7 9 11 D. 7 8 9
static 只会定义一次
2.在一个被调用函数中,关于return语句使用的描述,( )是错误的
A. 被调用函数中可以不用return语句
B. 被调用函数中可以使用多个return语句
C. 被调用函数中,如果有返回值,就一定要有return语句
D. 被调用函数中,一个return语句可以返回多个值给调用函数
return语句只能返回一个值
3.以下程序的运行结果为( )
#include <stdio.h>
#include <string.h>
int SubCount(char *dest, int count)
{
strcpy(dest, "555");
count++;
return 0;
}
int main()
{
int count = 3;
char caBuf[8];
SubCount(caBuf, count);
printf("%d\n", count);
return 0;
}
A. 8 B. 4 C. 3 D. 5
值传递,主函数中的count不会改变
4.请问运行Test函数会有什么样的结果?
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
GetMemory函数定义了一个局部变量,返回局部变量的地址,但局部变量地址会在函数结束时销毁,所以str会指向一个野指针
5.分析以下程序,写出运行结果并写出过程
#include <stdio.h>
#include <stdlib.h>
void getalloc(char *p)
{
p = (char *)malloc(100);
strcpy(p, "hello world");
}
int main()
{
char *str = NULL;
getalloc(str);
printf("%s\n",str);
free(str);
return 0;
}
主函数定义了一个空指针,在getalloc函数中分配了100字节的空间,将hello world赋值给了str
但由于是局部变量 分配的空间在函数结束时会销毁,所以运行结果会产生段错误
6.下列程序的输出结果是________。
fun(int a, int b, int c)
{
c = a*b;
}
void main()
{
int c = 10;
fun(2,3,++c);
printf("%d\n", c);
}
值传递,函数里面的结果不会传递到主函数中,所以c=11
7.找错题,说明那里错了
void test1()
{
char string[10];
char *str1 = "0123456789";
strcpy( string, str1 );
}
赋值时错误字符串结尾会有'\0'作为结束符,所以占11字节空间,开辟的数组空间不够,会越界
8.下面的代码片段会输出__________
void test(void)
{
char *p = NULL;
strcpy(p, "hello");
printf("%s", p);
}
段错误 空指针没有空间无法赋值
9.sizeof(str); 的值是多少?
void Func(char str[100])
{
sizeof(str);
}
数组参数在函数中会被当成指针处理,所以sizeof(str)不会计算数组的大小,在64位操作系统中值为8,在32位操作系统中值为4
10.递归函数最终会结束,那么这个函数一定( );
A. 使用了局部变量
B. 有一个分支不调用自身
C. 使用了全局变量或者使用了一个或多个参数
递归相当于死循环,会结束是因为有一个分支作为函数出口没有调用自身
11.程序如下,程序执行后的输出结果是:
int f(int x, int y)
{
return (y-x)*x;
}
void main()
{
int a = 3,b=4,c=5,d;
d=f(f(3,4),f(3,5));
printf("%d\n", d);
}
f(3,4)=3 f(3,5)=6 f(3,6)=9
12.请判断下面程序输出的值是多少?
int func(int a)
{
static int b = 0;
b+=a;
return b;
}
int main(void)
{
printf("%d %d\n", func(1)+func(3), func(5));
}
用了static b不会被重复定义 且printf会由右往左算所以先算func(5)=5
func(1)+func(3)=6+9=15
13.这段程序的输出是(________)
void f1(int *, int);
void f2(int *, int);
void(*p[2]) (int *, int);
main()
{
int a;
int b;
p[0] = f1;
p[1] = f2;
a=3;
b=5;
p[0](&a, b);
printf("%d\t %d\t", a, b);
p[1](&a, b);
printf("%d\t %d\t", a, b);
}
void f1(int * p, int q)
{
int tmp;
tmp = *p;
*p = q;
q = tmp;
}
void f2(int *p, int q)
{
int tmp;
tmp = *p;
*p = q;
q = tmp;
}
A. 5 5 5 5 B. 3 5 3 5 C. 5 3 5 3 D. 3 3 3 3
a是址传递,会交换数据,b是值传递,主函数中数据不会改变
14.有以下程序段, x=7执行后的值为 ( )
int fun(int x) {
int p;
if(x==0||x==1)
return(3);
p=x-fun(x-2);
return p;
}
A. 0 B. 2 C. 5 D. 6
7-fun(5)=7-(5-fun(3))=7-(5-(3-fun(1)))=2
15.有以下函数,该函数的返回值是:( )
char *fun(char *p)
{
return p;
}
A. 无确切的值 B. 形参 p 中存放的地址值
C. 一个临时存储单元的地址 D. 形参 p 自身的地址值
16.编写strcpy函数
已知strcpy 函数的原型是
char *strcpy(char *strDest,const char *strSrc);其中 strDest 是目的字符串,strSrc 是源字符串。
(1)、不调用 C 的字符串库函数,请编写函数 strcpy。
//函数声明
char* mystrcpy(char *p1,const char *p2);
int main(int argc, const char *argv[])
{
//定义一个足够长的数组存储拷贝字符串
char arr[100];
char brr[]="hello world";
mystrcpy(arr,brr);
printf("%s\n",arr);
return 0;
}
//定义函数
char* mystrcpy(char *p1,const char *p2)
{
//定义另一个指针来存储传递进来的参数
char *s=p1;
//没遇到结束符前一直循环
while(*p2)
{
*p1=*p2;
//指针偏移
p1++;
p2++;
}
//结尾添加结束符
*p1='\0';
return s;
}
(2)、strcpy 能把 strSr 的内容复制到 strDest,为什么还有 char"类型的返回值?
返回目标字符串的首地址,方便对目标字符串进行进行其他操作
(3)、strcpy 和 memcpy 的区别。
strcpy
用途: 专门用于复制 C 风格的字符串。
功能: 复制源字符串的内容到目标字符串,包括终止的空字符 '\0'
。
参数:char *dest
: 目标字符串的指针。
strcpy
用途: 专门用于复制 C 风格的字符串。
功能: 复制源字符串的内容到目标字符串,包括终止的空字符 '\0'。
参数:
char *dest: 目标字符串的指针。
const char *src: 源字符串的指针。
特点:
处理字符串时,自动处理字符串结束符。
目标字符串必须足够大以容纳源字符串及其结束符。
如果源字符串大于目标数组,可能会导致缓冲区溢出。
memcpy
用途: 用于复制内存块中的原始字节。
功能: 直接复制指定数量的字节,不考虑数据的类型或内容。
参数:
void *dest: 目标内存块的指针。
const void *src: 源内存块的指针。
size_t n: 要复制的字节数。
特点:
不处理字符串结束符,只是按字节复制。
常用于复制任意类型的数据,如结构体、数组等。
需要用户确保目标内存块有足够的空间。
17.请实现一个函数,输入一个整数,输出该数二进制表示中的1的个数。例如:把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。
//定义求二进制数有多少个1的函数
int fun(int n)
{
//定义变量来技术
int count=0;
while(n!=0)
{
//余数为1时+1
if(n%2==1)
{
count++;
}
//右移一位
n/=2;
}
return count;
}
int main(int argc, const char *argv[])
{
int num;
scanf("%d",&num);
printf("%d\n",fun(num));
return 0;
}
18.请用编写递归算法计算fibinacci数列第1000位的值。斐波拉契数列为1,1,2,3,5,8,13,21,……
//定义求斐波那契数列的函数
long int fbnq(int n)
{
//前两项为1
if(n==1||n==2)
{
return 1;
}
else
//从第三项开始等于前两项之和
return fbnq(n-1)+fbnq(n-2);
}
int main(int argc, const char *argv[])
{
int num;
scanf("%d",&num);
printf("第%d项的值为%ld\n",num,fbnq(num));
return 0;
}
19.用 C 语言写一个递归算法求 N!
//定义递归函数
int fun(int num)
{
//当值为1时 返回值为1
if(num==1)
{
return 1;
}
else
//当大于等于2时 返回值为1到num相乘
return num*fun(num-1);
}
int main(int argc, const char *argv[])
{
int n;
scanf("%d",&n);
printf("%d\n",fun(n));
return 0;
}