Day7(作业9)函数but持续晕针中

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
答案:D

分析:a主函数局部变量,赋值后未发生改变恒等于2.b是函数f中的局部变量,每次调用都赋值为0,函数调用结束后都会空间释放。c是静态局部变量,赋值一次到文件结束之后再释放空间。根据对i的自增控制函数f循环三遍,对a没有操作,恒为2,对于b,调用函数时分配内存空间,函数调用结束后空间又被释放,期间赋值0自增1,而c调用函数是分配内存空间直至最后主函数结束才释放空间,循环3次自增3次,即分别为2+1+4,2+1+5,2+1+6,返回即为789。

2.在一个被调用函数中,关于return语句使用的描述,( )是错误的 (软通动力)

A. 被调用函数中可以不用return语句

B. 被调用函数中可以使用多个return语句

C. 被调用函数中,如果有返回值,就一定要有return语句

D. 被调用函数中,一个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

答案:C

分析:参数传递形式采用的是值传递,该传递的特点便是形参的改变不会影响实参改变。即实参的数值3传递给形参后最后输出实参仍然是3.

4.请问运行Test函数会有什么样的结果?(华辰泰尔)

char *GetMemory(void)

{

    char p[] = "hello world";

    return p;

}

void Test(void)

{

    char *str = NULL;

    str = GetMemory();

    printf(str);

}

答案:没有任何输出,而且编译时有警告

分析,子函数定义的是一个返回类型为int*的指针的一个指针函数,首先其实际的返回类型并不是int*而是char*,其次指针函数是不能返回局部变量地址的。。。。错是肯定错的,报错类型确实我还不好推断只能敲个差不多错的代码看看。

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;

}

答案:定义指向单字节类型的指针str,并初始化为NULL之后调用函数getalloc,通过地址传参,使str = “100”之后通过strcpy函数将hello world复制给p,但是实际上超出了p的长度,所以会显示段错误核心已转储。试了试还真是,只能说蒙对了

6.下列程序的输出结果是________。(富士安全)

fun(int a, int b, int c)

{

    c = a*b;

}

void main()

{

    int c = 10;

    fun(2,3,++c);

    printf("%d\n", c);

}

答案:11

分析:值传递,形参改变不会导致实参跟着改变。值传递之前c已经变成11,所以形参接收的值是11,后面怎么变其实不重要了。所以输出的c就是11。另外若果是c++,最后输出的值也是11,但是形参接收值就是10了

7.找错题,说明那里错了(恩易物联1,深圳元征信息科技)

void test1()

{

    char string[10];

    char *str1 = "0123456789";

    strcpy( string, str1 );

}

答案:定义的string长度为10,但是str1长度为11,而strcpy函数的使用要求是第一个参数的长度要足够大,以便于能够接收第二个字符串的数据。再此,显然无法达到,错误的是strcpy的使用上。

8.下面的代码片段会输出__________ (飞音时代)

void test(void)

{

    char *p = NULL;

    strcpy(p, "hello");

    printf("%s", p);

}

答案:段错误(核心已转储)眼熟相当地眼熟,和7.5.两题可以说是如出一辙

9.sizeof(str); 的值是多少? (21年中航安为)

void Func(char str[100])

{

sizeof(str);

}

答案:8

分析:由于其是形参,没分配实际内存,sizeof(str)相当于对数组名指针取值,也就是8位.警告也表示将会返回sizeof(char*),取一个单字符只针的长度,就是8字节。

10.递归函数最终会结束,那么这个函数一定( );(北京信果科技)

A. 使用了局部变量

B. 有一个分支不调用自身

C. 使用了全局变量或者使用了一个或多个参数

答案:B

分析:只有不调用自己才能跳出函数,除非在调用自己之前就已经return了

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

分析: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));

}

答案:5 9

分析:b是静态局部变量,func(1)返回是1,func(3)在b=1的前提下返回为4,最后同样在b=4的前提下返回为9

  1. 这段程序的输出是(________) (青岛汉泰)

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

分析:值传递和地址传递,值传递形参改变不影响实参,地址传递,实参随着形参的改变而改变。

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

答案:B

分析:P= 7-(5-(3-3))=2

15.有以下函数,该函数的返回值是:( ) (山东信通电子)

char *fun(char *p)

{

    return p;

}

A. 无确切的值                                      B. 形参 p 中存放的地址值

C. 一个临时存储单元的地址           D. 形参 p 自身的地址值

答案:B

分析:返回值是一个指针的函数,返回的p就是指针,也就是p中存放的地址值。

16.编写strcpy函数 (山东山大电力技有限公司)

已知strcpy 函数的原型是

char *strcpy(char *strDest,const char *strSrc);其中 strDest 是目的字符串,strSrc 是源字符串。

(1)、不调用 C 的字符串库函数,请编写函数 strcpy。

(2)、strcpy 能把 strSr 的内容复制到 strDest,为什么还有 char"类型的返回值?

(3)、strcpy 和 memcpy 的区别。

答案:(1)

(2)知识盲区:

strcpy 函数的返回值是 char * 类型,它返回的是指向目标字符串 strDest 的指针。这个返回值的设计有几个原因:

  1. 链式调用:返回目标字符串的指针允许开发者进行链式调用,将多个字符串操作函数连续调用,这样可以提高代码的可读性和简洁性。例如:

     

    c

    char buffer[100];
    strcpy(buffer, "Hello"); // 复制字符串
    strcat(buffer, " World"); // 连接字符串
  2. 历史原因:在C语言的早期版本中,许多字符串操作函数都返回了目标字符串的指针,这成为了一种设计惯例。这种设计也使得这些函数的接口在不同的编译器和平台上保持一致。

  3. 兼容性:返回目标字符串的指针有助于保持与旧代码的兼容性。一些旧的代码可能依赖于这个返回值来进行进一步的操作。

  4. 错误处理:虽然不常见,但返回的指针可以用于错误处理。如果 strcpy 函数因为某种原因(如 strDestNULL)而无法执行复制操作,它可能返回 NULL。然而,标准的 strcpy 函数实际上不会进行这样的错误检查。

(3) strcpy将后字符串复制到前字符串上,memcpy更像是strncpy,复制前“n”个字节,但是memcpy不在乎内容,无论是否’\0'都复制过去。不过都要都要注意注意溢出?

17.请实现一个函数,输入一个整数,输出该数二进制表示中的1的个数。例如:把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。(矩阵软件)

答案:

#include<stdio.h>
#include<string.h>
int fun (int a );
int main(int argc, const char *argv[])
{
	int a ;
	printf("请输入一个数:");
	scanf("%d",&a);
	fun(a);
	printf("该数转化为二进制后1的数量是:%d\n",fun(a));
	return 0;
}
int fun(int a){
	int b=1,count = 0;
	while(a != 0){
		if(a%2==0){
			a =a/2;
		}else{
			count++;
			a = (a-1)/2;
		}
	}
	return count;
}

18.请用编写递归算法计算fibinacci数列第1000位的值。斐波拉契数列为1,1,2,3,5,8,13,21,…… (北京凝思软件)

答案:算不出来,级数太大,需要优化算法。

19.用 C 语言写一个递归算法求 N!(华辰泰尔)

答案:不会有人0!是0吧()

#include<stdio.h>
#include<string.h>
int fun (int a );
int main(int argc, const char *argv[])
{
	int a ;
	printf("请输入阶乘级数N:");
	scanf("%d",&a);
	fun(a);
	printf("N!=%d\n",fun(a));
	return 0;
}
int fun(int a){
	if(a==0){
		return 1;
	}else{
		return a*fun(a-1);
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值