본문 바로가기

2014 C/3월

2013.03.26


 #include <stdio.h>

void myCnt(char* cpstr);

char caStr[256= "";
char catemp[256= "";

//myCnt함수에서도 쓰일 수 있는 전역변수로 선언

int main()
{
  char* cpapple = "apple";
  char* cppineapple = "pineapple";
  char* cpbanana = "banana";
  char* cptomato = "tomato";

//******  myCnt함수 호출  ******/
  myCnt(cpapple);
  myCnt(cppineapple);
  myCnt(cpbanana);
  myCnt(cptomato);
//******myCnt함수 호출 끝******/
  
  printf("%s \n", caStr);

  return 0;
}

void myCnt(char* cpStt) // 17,18,19번째에 호출되어 받은 변수형태와 같아야한다. 인자이름은 달라두댐
//cpStt에 위에서 호출받은 myCnt(cpapple)…(cptomato)등등 의 cpapple의 인자값을 받아온다.
{
   int iNum;
   int iCnt=0;
 
   while(1// 반복문을 무한루프로 돌리게 하기위함.
   {
      if(0 != caStr[iCnt])
      {
         iCnt++;
      }
     //처음 입력받았을 때 여기서는 Null값이 들어있기 때문에 else문으로 빠져서 반복문 종료
      //두번째에는 caStr[0]~caStr[5]의 값에 apple''이 들어있으므로 iCnt를 null값 까지 증가시킨다.
      //apple''이 있기 때문에 iCnt는 null값이 있는 caStr[6]까지 작동함
      //그래서 iCnt의 값은 6이된다. (호출 될때마다 계속반복)
      else // iCnt값이 0이면 중지
      {
         break;
      }
   }
   for(iNum =00 != cpStt[iNum]; ++iNum)
   //for문으로 호출받은인자의 배열주소를 증가시키는 코드
   {
      caStr[iCnt] = cpStt[iNum];
      iCnt ++;
   //해석하면 caStr[iCnt] = cpapple[iNum]; 이 된다.
   //iCnt가 6이라고 치면 caStr[6]의 값에 cpapple[iNum]에 있는 값을 넣어라는말.
   //iCnt가 6이라고 치고 iNum이 3이라고 치면 cpapple의 3번째 값 l이 caStr[6]에 입력됨.
   }   
   caStr[iCnt] = ' ';
   //띄어써주는 공백문자배열
   return ;
}

 apple pineapple banana tomato


->같은 값 다른 방법의 코드


과일.c








이 코드의 방식은 castr의 값을 for문을 돌릴때마다 초기화 시킴  (배열에 자꾸 덮어씌어짐)




--

선생님 코드

main.c

--

























메모리의 위치를 알려주려고 주소인자 '&'를 사용하는데

char str[50]; 에서 처럼 str은 변수가 아닌 배열이고 이미 주소를 의미하므로 '&' 사용하지 않고 scanf문 사용한다.

 

* scanf문의 단점: 문자열의 수를 지정해 주더라도 키보드로 입력하는데로 입력받기 때문에(문자열의 경우) 보안상의 위험이 있어서 visual studio에서 컴파일시 경고가 뜰수 있다. (해킹의 위험성이 있기 때문에)

 

*scanf문은 자동으로  NULL 값이 입력된다.




iNum1 과 iNum2에 들어있는 값을 바꾸어주는 코드이다.

처음 출력하였을때 iNum1에 들어있는 값은 10 iNum2에 들어있는값은 100인 것을 알아두쟈


14번째줄에 swap함수를 호출하는 것을 볼수있다. swap함수에 입력시킨 인자는 iNum1과iNum2의 주소값


29번째줄에 int* 형으로 iNum1과iNum2를 *n1과 *n2에 받았다.






int iTemp을 선언하여 빈공간을 생성한 후 *n1의 값을 iTemp에 넣는다.






그리고 *n2의 값을 *n1에 넣는다.




그리고 마지막으로 iTem의 값을 *n2에 넣는다.




                                       (결과)



이렇게해서 iNum1과iNum2의 값이 서로 바뀌게 되었다.





*null이 없다면? 쓰레기값 출력!



왼쪽코드는 null 즉 0이 있지만 오른쪽코드에는 null값을 주지않았다.

str의 byte는 50byte이고 printf의 %s로 문자열 즉 str안에 들어있는 모든 값을 출력요청하였다.

왼쪽코드는 %s를 출력하다가 str[7]번째에 들어있는 null값을 만나 출력을 중지 했지만

오른쪽코드는 null값을 넣어주지 않았기에 null값을 만날때까지 계속해서 쓰레기값이 들어있는 str[8]~str[50]을 출력하다가 

null을 만나 중지시킨것

저기서 4와 공백문자 그리고 화살표모양은 전부 아스키코드이다.





****

문자열 

ex) "Hi~", "Hello~"

같은 경우에는 끝에 null문자가 자동으로 붙지만

문자배열

ex) 'H','i','~'

같은 경우에는 프로그래머가 null을 넣지않으면 끝에 자동으로 붙지 않는다.

****


'2014 C > 3월' 카테고리의 다른 글

2014.03.28  (0) 2014.03.28
2014.03.27  (0) 2014.03.27
2014.03.26  (0) 2014.03.26
2014.03.25  (0) 2014.03.25
2014.03.25  (0) 2014.03.25