C语言练习11.4

来源:互联网 发布:知乎乌金木和赤金檀木 编辑:程序博客网 时间:2024/05/18 03:37

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

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是要求移动的nvoid 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;}



原创粉丝点击