초보자 노트 - 함수 바늘의 간단한 응용

15184 단어 함수 포인터
       data 
 1
int strcpy1(char *brr, char *crr) 2 { 3 int i=0; 4 while(*(crr+i)) 5 { 6 *(brr+i) = *(crr+i); 7 i++; 8 } 9 10 *(brr+i) = '\0'; // *(crr+i) 11 } 12 13 int main() 14 { 15 int i; 16 char *arr = "hello!"; 17 char data[1024] = {0}; 18 19 int (*p)(char *, char *) = strcpy1; 20 p(data, arr); 21 22 printf("%s
", data); 23 }

출력 결과:hello!
원인: * (crr+i)가 읽기 전용 구역에 있기 때문에 세그먼트 오류가 발생합니다!
방법2:
 1 #include <stdio.h>

 2 

 3 char * strcpy1(char *brr, char *crr)

 4 {

 5         int i=0;

 6         while(*(crr+i))

 7         {

 8                 *(brr+i) = *(crr+i);

 9                 i++;

10         }

11 

12         *(brr+i) = '\0';  //   *(crr+i)

13         return brr;

14 }

15 

16 int main()

17 {

18         int i;

19         char *arr = "hello!";

20         char data[1024] = {0};

21 

22         char *(*p)(char *, char *) = strcpy1;

23         char *red = p(data, arr);

24 

25         printf("%s 
", red); 26 }

문자열을 거꾸로 설정하려면 다음과 같이 하십시오.
#include <stdio.h>

#include <string.h>



char *fox(char *dest, char *src)

{

        int i, j;

        for(i=strlen(src)-1, j=0;i>=0; i--,j++)//sizeof(src)     ,src   

        {

                *(dest+j) = *(src+i);

        }



        *(dest+j) = '\0';

        return dest;

}



int main()

{

        char *p = "hello!";



        char data[1024] = {0};



        char *(*fp)(char *, char *);

        fp = fox;

        char *red = fp(data, p);



        printf("%s 
", red); }

주의: fox 함수에서sizeof()를 사용하면 바늘 src의 크기인 4바이트를 되돌려줍니다. src가 가리키는 문자열의 길이가 아닙니다.
콜백 함수 및 구조체 내 함수 포인터 사용:
 1 #include <stdio.h>

 2 

 3 struct person{

 4         int (*p)(int, int);

 5 };

 6 

 7 int mtod(int m, int d)

 8 {

 9         static int month[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

10         int days = 0;

11         int i, j;

12 

13         if(m == 1)

14                 return d;

15         else

16         {

17                 for(i=0; i<=m-2; i++)

18                         days = days + month[i];

19                 return days+d;

20         }

21 }

22 

23 int time(int (*p)(int, int), int i, int j)

24 {

25         p(i, j);

26 }

27 

28 int main()

29 {

30         int i, j, k, l;

31         i = mtod(12,31);

32         printf("%d 
", i); 33 34 int (*p)(int, int) = mtod; 35 j = p(1,1); 36 printf("%d
", j); 37 38 k = time(p, 2, 10); 39 printf("%d
", k); 40 41 struct person jim; 42 jim.p = mtod; 43 l = jim.p(12,30); 44 printf("%d
", l); 45 }

오늘의 주요 내용은 이것들뿐이어서 좀 빙빙 돌기 때문에 더욱 숙련되어야 한다.

좋은 웹페이지 즐겨찾기