C语言练习11.4

下面是具体的三个问题,这次的问题稍微复杂了一点

1、   读程序,写出你的分析步骤,得出结果。
typedefint (*FUNC1)(int);
typedefint (*FUNC2)(int *, int *, int *);
intinc(int a)
{          
   return (++a);
}
int multi(int *a, int *b, int *c)
{
   return (*c=*a**b);
}
void show(FUNC2 fun, int arg1, int *arg2)
{
   FUNC1 p = inc;
   int temp = p(arg1);
   fun(&temp, &arg1, arg2);
   printf("%d\n", *arg2);
}
主程序:int a = 0; show(multi, 10, &a);
2、阅读一下程序,找出错误并更改。PS:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”
<所有头文件都已包含>
main()
{
char*src="hello,world";
char* dest=NULL;
int len=sizeof(src);
dest=(char*)malloc(len);//这里的这个长度为len+1       
char* s=src[len];           
while(len--!=0)
dest++=s--;          
printf("%s",dest);
return 0;
}
3、编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefg”
 
//pStr是指向以''结尾的字符串的指针
//steps是要求移动的n

void LoopMove ( char * pStr, int steps )
{
 //请填充...
}


 



解答:

(1):

对于第一个问题,最困难的地方在于它程序的前两行,理解对于我们是非常困难的,但是,代入到具体的具体的show函数时,可以发现FUNC2它作为一个形参,居然可以使用函数 multi的功能时,第一二行大概是函数的另类的声明,所以,一切问题迎刃而解。所以对于FUNC1来说,它指向了inc类型的函数,于是FUNC1声明的p就有了inc的功能。类似的FUNC2 声明的fun有了multi的功能是相同的,所以,按照逻辑最后走下来,它的最后的结果为110.

虽然很勉强,但是理解水平有限。

#include <stdio.h>
typedef int (*FUNC1)(int);// FUNC1是指向int (*)(int)的函数指针类型
typedef int (*FUNC2)(int *, int *, int *);//FUNC2是指向int (*)(int*,int*,int*)的函数指针类型
int inc(int a)
{
	return (++a);
}
int multi(int *a, int *b, int *c)
{
	return (*c=*a**b);
}
void show(FUNC2 fun, int arg1, int *arg2)
{
	FUNC1 p = inc;//分析:调用show函数:1、temp=inc(10)也就是11.
					//2、fun(&temp, &arg1, arg2) -> *arg2 = 10 * 11 = 110
						//3、arg2是指针,作为输出型参数存在,所以将&a传入后会影响变量a的原始值
	int temp = p(arg1);
	fun(&temp, &arg1, arg2);
	printf("%d\n", *arg2);
}
int main(){
int a = 0;
show(multi, 10, &a);
}


(2):

对于第二个问题,由于平时所用的字符的操作完全就是用数组(虽然本质还是一个指向数组首地址的指针),本质上是懒的,所以还是想了一想。但是,纸上抄了一遍发现问题真的非常的致命!

对于程序来说,最怕的就是程序崩溃的问题,其次都是小case,但是这个题忽略了数组越界的问题,所以,在计算数组长度的时候,由于数组下标是从0开始的,所以最大的下标为最大长度-1,然而,这个题忽略了这个问题,所以只需要程序就会正确吧。但是,实际运行的时候字符指针那里显示错误。还有申请空间的时候需要去 多申请一个存放字符串结束标志的符号‘\0’,dest使用完毕后需要释放dest所占用的内存(c的编译器在程序运行结束后不会对它进行处理,需要程序猿自己搞定)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char *src="hello,world";
char* dest=NULL;
int len=strlen(src);
dest=(char*)malloc(len+1);
char*p =dest;
char *s=&src[len-1];
while(len--!=0)
{
*p++=*s--;//字符串的倒置
}
*p='\0';
printf("%s",dest);//要用一个指针去记录dest的初始位置,否则打印不了新的字符串
	return 0;
}


(3):

对于第三个问题,还是自己慢慢写下,因为没用过指针解决字符串的问题。很不幸的是,由于水平问题,只能是附上错误的代码,因为编译器编译以上题目,只有题1通过测试,字符的指针的都没有通过。所以只能靠瞎蒙了。

先求出上述要移动 的字符串的长度,之后就是进入循环,循环次数为移动的个数。(需要另外用一个指针保存字符串的首地址)。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void loop_move (char *p, int steps){
	int i = 0, j = 0;
	char s;
	int len = strlen(p)-1;
	for(i=0; i<steps; i++)
	{
		s = p[len];
		for(j=len; j>0; j--)
		{
			p[j] = p[j-1];
		}
		p[0] = s;
	}
}
int main(void)
{
	int n;
	char s[20];
	gets(s);
	scanf("%d",&n);
	loop_move(s,n);
	printf("%s", s);
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值