게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
C언어 포인터관련 질문드려요
게시물ID : jisik_90607짧은주소 복사하기
작성자 : 환상☆
추천 : 0
조회수 : 525회
댓글수 : 3개
등록시간 : 2010/12/15 04:01:47
수업시간에 했던 내용인데 printf를 직접 구현하는건데
포인터는 아무리봐도 모르겠어요 ㅠㅠ
궁금한 내용은 주석 달아놓은 //Q.1 //Q.2 부분이에요

그리고 case 'd'는 적다가 다 못적었구요,
case 's' 는 전혀 이해가 안되네요;;
설명좀 부탁드립니다.....



#include <stdio.h> 


int nprintf(char * format, ...)
{
   void *param;
   param = &format;   ////////format의 주소값
//Q. format의 주소값? 그러면 param은 ** 이 되어야 하지 않나요?
   char *k;
   int i, j, x, y, z;
   char n[12];   // 2010 -> [2][0][1][0] //부호, Null 포함

   while(*format)
   {
      if(*format=='%')
      {
         ++format;
         switch(*format)
         {
         case 'c':
            param=(char*) param+4;   //1바이트 늘려야 함, ++하면 안됨(자료형을 모르기 때문에)
                              //char 은 1바이트씩 움직이니까 char 로 캐스팅
                              //포인터는 대상의 크기만큼 증가
            putchar (*(char*)param);//putchar (*param); 출력해야하는데 대상이 char의 포인터. 따라서 캐스팅.
//Q. param이 가지고있는건 format의 주소값 아닌가요?
            break;
         case 'd':
            param=(char*) param+4;   //ex)3500원 -> 1000*3 + 100*5
            printf("%d\n", *(int *)param);
            i=0;
            if(*(int * )param<0)
            {
               n[0]='-';
                  i=1;
            }
            /*
            if(x<0)
               n[i++]='-';
            */

            else
            {
               i=0;
            }

            for (j=1000000000; j>0; j=j/10)
            {
               x=*(int *)param / j;   //나누기할때 자료형, 자리수 중요. 
                                 //float c= int a/int b;
               if(x!=0)
               {
                  n[i]=x+'0';   //아스키(48)로 출력. 문자는 숫자로 취급 가능
                  i++;

               }
            }
            break;

         case 's':         //복잡함. 대상이 뭔지 파악 중요.
            param=(char*) param+4;
            k=*(char **)param;

            while(*k)      // Null 인지 확인
            {
               putchar(*k);
               ++k;
            }
            
            /*
            while(*(*(char**)param))
            {
               putchar (*(char*)param);
               param+(char*) param+4;
            }
            */

            break;
         }

      }
      else
      {
         putchar(*format);
      }
      ++format;
   }
   return 0;
}


int main()
{
   int a;
   char b[4]="bbb";
   
   printf("a%ca%s%d\n", 'a', b, 2010);
   nprintf("a%ca%s%d\n", 'a', b, 2010);

   return 0;
}
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호