본문 바로가기

C언어

(22)
Chapter 10. 바로알자 getchar() Chapter 10.바로알자getchar() 특히 초보자에게황당한논리적인 에러를 짚고 넘어가자. 10_1.c #include main() { int input_char = 0; while(1) { printf("Input character : "); input_char = getchar(); if((input_char == 'y') || (input_char == 'Y')) puts("OK, 'y' input"); else puts("NO"); } } gcc -o 10_1 10_1.c ./10_1 Input character : y OK, 'y' input Input character : NO Input character : n NO Input character : NO Input character : ..
Chapter 11. 가변 인자 Chapter 11.가변 인자 마을 풀어보면 "인자가 변한다"가 될것이다. 정학한 뜻은 인자의 개수가유동적으로 변한다는 것이다. 따라서, 지금까지 인자의 개수를 한정지어 작성되었던 프로그램(인자의 개수에 따라 처리 함수가 여러개 존재하는)을 훨씬 간단하게 작성할 수 있다. 가변 인자 사용 단계 1. 함수의 원형 정의 int function(int, ...); 인자 리스트에"..."을 사용한다. 2. 함수의 본체 작성 int function(intcount, ...) { } 함수본체에서는 원형에서 생략했던 변수명을사용해야 한다는 것을 제외하고는원형과 크게 다르지 않다. 3. 헤더 파일 포함 #include 위처럼 헤더 파일을 포함해야 가변 인자를 사용할 수 있다. 가변 인자를 위한 매크로 가변 인자를 위한..
Chapter 12. 될 것 같으면서 안 되는 코드 Chapter 12.될 것 같으면서 안 되는 코드 초보자들이 아무리 들여다봐도 결국에는 해결하지 못하고나중에는 편법을 자행하는 대표적인것으로쓰레기 주소 값이다. char *imsip; strcpy(imsip, "archie"); 현재 imsip가 가리키는 번지는 쓰레기 값이므로 문제가 발생한다. 이를 해결하려면malloc()을 사용하는 것인데 사용할 때마다 추가해 주어야 하는 번거로움이 있다. 이를대신 해주는 함수를 이용한 프로그램을 작성해 보자. 더불어 하나의 문자열 뿐만 아니라 여러개의 문자열도 처리할 수 있도록 해보자. 12_1.c #include #include // malloc(), NULL #include // va_start(), va_arg(), va_end() #include // str..
Chapter 7. strcpy()의 비밀 Chapter 7.strcpy()의 비밀 7_1.c #include #include main() { //char *imsip; char imsi[10]; //strcpy(imsip, "archie"); strcpy(imsi, "archie"); puts(imsip); } gcc -o 7_1 7_1.c ./7_1 //세그멘테이션 오류 archie 포인터변수로 선언된 imsip에 strcpy()를 이용하여 문자열을 할당할 경우 위와같이 메모리참조 에류가 발생한다. 배열을 이용한strcpy() strcpy(imsi, "archie"); 배열로 선언된imsi에 strycpy()를 이용하여 문자열을 할당하는 경우 각각의 배열요소에 문자열의 각 문자 하나씩 할당된다. imsi[0] = 'a', imsi[1] = '..
Chapter 8. 뒤죽박죽 포인터 Chapter 8.뒤죽박죽 포인터 int imsi[3] = {5, 3, 8}; printf("%d %d %d\n", imsi[0], imsi[1], imsi[2]); printf("%d %d %d\n", *imsi, *(imsi + 1), *(imsi + 2)); 위의 imsi[0]과 *imsi에 대해서 잘못된 개념을 갖고있다면 정확히 알아보자. "imsi[0]은 배열이고 *imsi는 포인터이다" 라고생각해서는 안된다. imsi[0]은 포인터 변수를 배열적으로 표현한 것이고 *imsi는 포인터 변수를 포인터 변수답게 표현한 것이다. imsi[0]은 imsi가 가리키는 곳에서 얼마나 떨어져 있는지를 첨자를 통해서 표시한 것뿐, 절대 배열이 아님을 명심하자. 8_1.c #include main() { int..
Chapter 9. 포인터의 개념을 깨는 `0` Chapter 9.포인터의 개념을 깨는'0' 포인터 변수는주소 값을 저장할 수 있는 변수라는 의미이다. 누차 강조했지만포인터 변수에는 주소값 이외에는 어떠한 값도 할당 될 수 없다. 따라서, 포인터 변수에 할당되어 있는 값은 주소 값이 되는 것이다. 9_2.c #include main() { char*imsip; imsip= 0; printf("%#010x\n", imsip); } gcc-o9_2 9_2.c .9_2 0000000000 널 포인터 어느곳도 가리키고 있지 않는 주소 값, 어느 곳도 가리키지 않는 포인터, 할당되지 않은 포인터를 대표하는 것이 널 포인터다. 따라서, 널포인터를 이용하여 값을 출력하려고 하면 문제가 발생한다. 9_3.c #include main() { char *imsip; i..
Chapter 4. 문자열과 포인터 Chapter 4. 문자열과 포인터 C언어는 문자열을 문자 배열로 정의한다. a,'a', "a"의 차이 문자열은 반드시 NULL 문자로 끝나도록 정해져 있으므로"a"는 '\0'을 포함하고 있다. 4_1.c #include main() { char *imsip; char imsi; imsip = 'a'; (1) imsip = "a"; (2) imsi = 'a'; (3) imsi = "a"; (4) } gcc -o 4_1 4_1.c 4_1.c: In function ‘main’: 4_1.c: 8: warning: assignment makes pointer from integer without a cast 4_1.c: 12: warning: assignment makes integer from pointer..
Chapter 5. 포인터의 포인터 Chapter 5.포인터의 포인터 포인터의 포인터는 다루는 대상체가 포인터인 포인터 변수를 뜻한다. 즉, 포인터들을 다루는 포인터라는 이야기다. 포인터의 포인터 변수 정의 char**imsipp; 어디에 사용 하는가 매개변수가 포인터 배열인 함수를 작성하기 위해 사용 명령행 인자에서 사용 초기화 5_1.c #include main() { char *imsip[3], **imsipp; int one, *two, **three; imsip[0] = "imsi"; imsip[1] = "temp"; imsip[2] = "jamgan"; imsipp = imsip; two = &one; three = &two; } 포인터의포인터 변수에서는 다음을 명확히 알아두어야 한다. three 포인터의 포인터 변수이므로 주소..