#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 = 0 ; 0 != 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
선생님코드 접기
#include < stdio.h> int main() { char caStr[256 ]= "" ; char caTemp[256 ]= "" ; char * cpApple= "Apple" ; char * cpBanana= "Banana" ; char * cpTomato= "Tomato" ; char * cpPineapple= "Pineapple" ; unsigned int uiCnt; unsigned int uiLen; uiLen= 0 ; for (uiCnt = 0 ; 5 > uiCnt ; ++uiCnt) { caStr[uiLen]= cpApple[uiCnt]; ++uiLen; } caStr[uiLen]= ' ' ; ++uiLen; for (uiCnt = 0 ; 6 > uiCnt ; ++uiCnt) { caStr[uiLen]= cpBanana[uiCnt]; ++uiLen; } caStr[uiLen]= ' ' ; ++uiLen; for (uiCnt = 0 ; 6 > uiCnt ; ++uiCnt) { caStr[uiLen]= cpTomato[uiCnt]; ++uiLen; } //****************************************** for (uiCnt = 0 ; 13 > uiCnt ; ++uiCnt) { caTemp[uiCnt]= caStr[uiCnt+6 ];
//caTemp에 caStr[6]번지부터의 값을 넣어라. 여기서는 banana''tomato''를 catemp에 넣게됨
} uiLen= 6 ; for (uiCnt = 0 ; 9 > uiCnt ; ++uiCnt) { caStr[uiLen]= cpPineapple[uiCnt]; ++uiLen; } caStr[uiLen]= ' ' ; ++uiLen; for (uiCnt = 0 ; 13 > uiCnt ; ++uiCnt) { caStr[uiLen + uiCnt] = caTemp[uiCnt]; } //****************************************** printf("%s\n" , caStr); return 0 ; }
-------
//****** 밑에있는 13은
banana''tomato'' 을 모두합친 byte수
접기 --
메모리의 위치를 알려주려고 주소인자 '&'를 사용하는데
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을 넣지않으면 끝에 자동으로 붙지 않는다.
****