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;
}



發佈了21 篇原創文章 · 獲贊 23 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章