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;
b++;
c++;
return (a+b+c);
}
A. 777 B. 7 10 13 C. 7 9 11 D. 7 8 9
分析:
在 f 函数中:
b
初始化为 0(每次调用都会重新赋值)。c static静态局部变量,编译时赋初值,只赋一次。
2、在一个被调用函数中,关于return语句使用的描述,( )是错误的
A. 被调用函数中可以不用return语句
B. 被调用函数中可以使用多个return语句
C. 被调用函数中,如果有返回值,就一定要有return语句
D. 被调用函数中,一个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
分析:在上述代码中,函数部分返回值是return 0,不会改变主函数中count的值,故count还是原来的值3。
4、请问运行Test函数会有什么样的结果?
char *GetMemory(void) //指针函数,即返回值是字符指针的函数。
{
char p[] = "hello world";
return p;
}
void Test(void) //定义了一个无参数无返回值的函数
{
char *str = NULL;
str = GetMemory();
printf(str); //printf(“hello world”);
}
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;
}
6、下列程序的输出结果是________。
fun(int a, int b, int c)
{
c = a*b;
}
void main()
{
int c = 10;
fun(2,3,++c);
printf("%d\n", c); 输出:6.
}
7、找错题,说明那里错了
void test1()
{
char string[10]; //没问题,定义一个大小为10的数组。
char *str1 = "0123456789";//有问题,指针是用来装地址的,而不是装字符串的。
strcpy( string, str1 );//有问题,string的空间为10,实际可用空间为9。
//而str1是一个字符长度为10的字符串,
//故string无法容纳下str1,会出现溢出。
}
8、下面的代码片段会输出__________
void test(void)
{
char *p = NULL;
strcpy(p, "hello");
printf("%s", p);
}
9、sizeof(str); 的值是多少?
void Func(char str[100])
{
sizeof(str);
}
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);
}
答案: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));
}
答案:5和9
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
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
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 *my_strcpy(char *str1,char *str2 ){
char *p;
p = str1; //储存str1的地址
while(str2!= 0){
str1=str2;
str2++,str1++;
}
*str1= 0;//将更新后的数据内容后添加看门狗,以防数据错误。
return p;//返回p储存的str1的地址,与定义函数时的返回值类型呼应
}
(2)、strcpy 能把 strSr 的内容复制到 strDest,为什么还有 char"类型的返回值?
返回值是一个指针,储存的是strDest的地址,使用函数结果是时,可通过地址访问。
(3)、strcpy 和 memcpy 的区别。
- strcpy:用于复制字符串。它会从源字符串复制字符到目标字符串,直到遇到空字符(\0),诺没有空字符,会给目标字符串的末尾添加一个空字符。
- memcpy:用于复制内存块。它会按照指定的字节数从源地址复制数据到目标地址,不会处理字符串的结束符。
17、请实现一个函数,输入一个整数,输出该数二进制表示中的1的个数。例如:把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。
int p=0,s=0;//p记录余数,s记录1的个数;
int DbB(num)
{
int p=0,s=0;//p记录余数,s记录1的个数;
int old_num=num;
while(num=!0){
p = num%2;
num = num/2;
if(p==1){
s++;
return s;
}
printf("%d转换成二进制后,二进制数中1的个数:%d",old_num,DbB(num/2));
return 0;
}
18、请用编写递归算法计算fibinacci数列第1000位的值。斐波拉契数列为1,1,2,3,5,8,13,21,……
int FBNQ(n)
{
if (n <= 0){
return 0
}else if{n == 1 or n == 2:
return 1
}else{
static int c=4;
int a=1,b=2;
int *s;
*s=a+b;
a=b;
b=*s;
c++;
while(c==n+1){
return c;
}
}
}
19、用 C 语言写一个递归算法求 N!
long long Fac(int n) {
if (n == 0) {
return 1; // 0! = 1
} else {
return n * factorial(n - 1); // n! = n * (n-1)!
}
}