C언어2 4차시강의자료 이대종( 한경대학교) 1 차시. 자료형( 데이터유형) 1.1 문자형데이터형식 ( char 형 ) 1.2 소수점이없는정수형 ( int 형 ) 1.3 소수점이있는실수형 (float 형, double 형 ) 2 차시. 연산자 2.1 2.2 2.3 2.4 산술연산자 증감연산자 관계연산자 논리연산자 3 차시. 제어문 ( 조건문, 반복문) 3.1 조건문 3.2 반복문 4 차시. 문자열처리 4.1 문자형배열( 문자열) 4.2 문자열처리함수 4.3 문자열입출력함수( 콘솔입출력) 5 차시. 변수( 지역변수, 전역변수) 5.1 함수 5.2 변수 6 차시. 포인터개념및응용 1 6.1 6.2 포인터자료형구분 포인터를이용한데이터접근하기 6.3 포인터를이용한 1차원배열다루기
7 차시. 포인터개념및응용 2 7.1 포인터를이용한 2차원배열다루기 7.2 7.3 포인터배열 문자형포인터응용 8 차시. 포인터개념및응용포인터를이용한동적메모리조작 8.1 포인터의사용목적 8.2 포인터변수를이용한동적메모리사용하기 ( 변수형) 8.3 포인터변수를이용한일차원배열의동적메모리할당 9 차시. 구조체 9.1 9.2 구조체개요 구조체연습 10 차시. 파일입출력 1 10.1 파일입출력 11 차시. 파일입출력 2 11.1 파일입출력응용 12 차시. 수학함수와유용한함수 12.1 12.2 12.3 수학함수 난수발생함수 타임함수 13 차시. 종합예제 [ 종합예제-1] 헤더파일작성종합 [ 종합예제-2] 다운받은헤더파일이용하기 [ 종합예제-3] 로또숫자자동발급프로그램작성 [ 참고] 링크드리스트 [ 참고] 문제
4 차시. 문자열처리 4.1 문자형배열( 문자열) 문자열은문자들을모아놓은배열이다. 반드시문자열의맨끝에는널문자 (NULL, '\0' ) 이설정되어야만한다. printf 를이용하여문자열출력시서식은 %s, 한문자출력시서식은 %c 임 [ 예제 4.1-1] NULL문자의수동삽입 char a[3]; a[0]='a'; a[1]='b'; a[2]='c'; char a[3]; a[0]='a'; a[1]='b'; //a[2]=null; a[2]='\0'; 문자열에서배열의크기는 문자열길이+1 이어야한다. ( 널문자까지고려해야함) [ 예제 4.1-2] 문자열초기화방법 char a[3]; a[0]='a'; a[1]='b'; a[2]=null; char a[3]='a','b','\0'; - 3 -
[ 예제 4.1-3] NULL 문자의자동삽입 배열의선언과동시에큰따옴표 로문자를 초기화하는경우널문자자동삽입됨 char a[3]="ab"; char a[3]="abc"; // 주의요망 문자열에서배열의크기는 문자열길이+1 이어야한다. ( 널문자까지고려해야함) [ 예제 4.1-4] 보편적으로사용되는문자열초기화방법 char a[]="abcdefg"; char a[3]="abc"; // 주의요망 NULL의아스키코드값은 0임 [ 예제 4.1-5] 문자열에서문자변경하기 char a[]="aaaaa"; a[0]='b'; char a[]="aaaaa"; a[5]='b'; - 4 -
[ 예제 4.1-6] while(null), if(null) 의의미 NULL 은문자열의끝을의미하는것으로값자체를갖지는않는다. 조건문에 NULL 값이들어갈경우자동으로아스키코드값(0) 으로형변환시킴 printf("%c\n",null); printf("%c\n",'\0'); printf("%d\n",'\0'); printf("%d\n",null); if(null) printf("null\n"); if('a') printf("aaa\n"); if('0') printf("000\n"); if('\0') printf("\0\n"); char a[]="12345"; int i=0; while(a[i]) printf("%c",a[i++]); printf("\n"); - 5 -
4.2 문자열처리함수 strlen, strcpy, strncpy, strcat, strncat, strcmp, strncmp, strstr 문자열함수를사용하려면 <string.h> 을포함시켜야한다. 용도함수사용예 문자열의길이를알려주는함수 strlen( ) strlen( 문자열); 문자열을복사하는함수 strcpy( ), strncpy( ) 두문자열을이어주는함수 strcat(), strncat( ) 두문자열을비교하는함수 strcmp( ), strncmp( ) 특정문자열의위치를찾는함수 strstr( ) 참고) 약어 strlen : string length, strncpy : String Number Copy strncat : String Number Concatenate strncmp : String Number Compare strchr : string character strcpy( 문자열A, 문자열B) 문자열A 에문자열 B 를복사( 널문자포함) strcat( 문자열A, 문자열B) 문자열A다음에문자열B를이어줌 r=strcmp( 문자열A, 문자열B) 문자열A와문자열B가같다면 0 char *cp = strstr( 문자열A, 찾는문자열) 검색성공시검색된위치의포이터값( 번지) 을 반환하며, 실패시 NULL 값을반환함 l strlen( ) NULL 문자를제외한문자열의길이를알려준다. [ 예제 4.2-1] 문자열에서문자변경하기 char str1[]="12345"; char str2[]="ab"; printf("%d\n",strlen(str1)); printf("%d\n",strlen(str2)); char str[]="12345"; int len = strlen(str); int i; for(i=0;i<len;i++) printf("%c",str[i]); printf("\n"); - 6 -
2 strcpy( ), strncpy( ) strcpy( 문자열A, 문자열B) 문자열A 에문자열 B 를복사 ( 널문자포함) [ 예제 4.2-2] strcpy( ) char str[5]; strcpy(str, "ABCD"); printf("%s\n",str); char str1[]="12345"; char str2[6]; strcpy(str2, str1); printf("%s\n",str2); [ 예제 4.2-2] strcpy( ) 주의할점 < 메모> char a[4]; char b[4]; strcpy(a, "ABC"); strcpy(b, "DEFG"); printf("%s\n",b); printf("%x\n",&a); printf("%x\n",&b); - 7 -
[ 참고] strcpy() 와 memcpy() 비교 strcpy - 문자열복사를위한함수로서길이를지정안하는대신 source 문자열이반드시 '\0' 으로 끝나야함 - source 에서 '\0' 을만나면복사를종료함 ('\0' 까지복사됨) memcpy는형에관계없이임의의영역을지정한 byte 수만큼복사하는기능을수행함 예 ) char dsts[64], srcs[]="string copy"; strcpy(dsts, srcs); memcpy(dsts, srcs, strlen(srcs)+1); '\0' 까지처리하기위해복사할 size를strlen(srcs)+1 로지정해주어야함 두가지기능비교 - 둘다메모리복사란점에서는같은역할을하지만문자값을비교하여종료하느냐, - - byte 수를따져종료하느냐의차이가있음 용도가틀리다고말할수는있어도어떤것이더효율적이다라고는말하기어려움 속도의차이는통상컴파일러종류와운영체제에따라서가변사항이있음 - 보통 strcpy 보다는 memcpy가안정적임 char src1[]="abcdefg"; char dest1[20]; char dest2[20]; strcpy(dest1,src1); memcpy(dest2, src1, strlen(src1)+1); // 바이트기준 printf("%s\n",dest1); printf("%s\n",dest2); - 8 -
strncpy( 문자열A, 문자열B, n) 문자열A에문자열 B중에서 n번째까지복사 ( 주의 : NULL 문자까지복사하지않음) [ 예제 4.2-3] strncpy( ) char a[3]; strncpy(a,"abcdef",2); char a[3]; strncpy(a,"abcdef",2); a[2]=null; 3strcat(), strncat( ) [ 예제 4.2-4] 두문자열을이어주는함수 char a[15] = "star"; char b [6] = "craft"; strcat (a, b); printf("%s\n", a); printf("%s\n", b); strcat (a, b); printf("%s\n", a); printf("%s\n", b); char a[15] = "star"; char b [6] = "craft"; strncat (a, b,2); printf("%s\n", a); printf("%s\n", b); strncat (a, b,3); printf("%s\n", a); printf("%s\n", b); - 9 -
4 strcmp(), strncmp() 두문자열을비교하는함수 문자열이같다면 0 을돌려주고, 다르다면그외의숫자를돌려줌 [ 예제 4.2-5] strcmp(), strncmp() char a[]="abcd"; char b[]="abcd"; char c[]="abcf"; int r1, r2; r1=strcmp(a,b); r2=strcmp(a,c); printf("%d\n",r1); printf("%d\n",r2); char a[]="abcd"; char b[]="abcd"; char c[]="abcf"; int r1, r2; r1=strncmp(a,b,3); r2=strncmp(a,c,3); printf("%d\n",r1); printf("%d\n",r2); 5 strstr( ) 특정문자열의위치를찾는함수 검색성공시검색된위치의포이터값( 번지) 을반환하며, 실패시 NULL 값을반환함 [ 예제 4.2-6] strstr( ) < 메모> char a[]="abcd"; char *r; r=strstr(a,"cd"); if(r!=null) printf("%c\n",*r); else printf(" 못찾음\n"); - 10 -
4.3 문자열입출력함수( 콘솔입출력) 콘솔 : 키보드나모니터와같은표준입출력장치를말함 ( 1) 콘솔표준입출력함수(stdio.h): 중간에버퍼이용 - 입력버퍼( 표준입력스트림), 출력버퍼( 표준출력스트림) (2) 콘솔비표준입출력 (conio.h) : 버퍼이용하지않고직접데이터를읽어오거나출력 구분 표준입출력 <stdio.h> 비표준입출력 <conio.h> 함수사용법함수사용법 입력 getchar() char ch=getchar(); getch() getche() char ch=getch(); char ch=getche(); gets char chs[10], gets(chs); 문자열처리함수없음 출력 putchar() putchar(ch) putch() putch(ch) puts puts(chs) 문자열처리함수없음 콘솔표준입력출력함수중에서printf와scanf는생략 getchar() 와getch() 의차이점 getchar() 는엔터키를치기전까지대기, getch() 는한문자입력되면바로종료 [ 예제 4.3-1] 한문자다루기 char ch1,ch2,ch3; puts("ch1 입력"); ch1 = getchar(); putchar(ch1); puts("ch2 입력"); ch2 = getchar(); putchar(ch2); puts("ch3 입력"); ch3 = getchar(); putchar(ch3); #include <conio.h> char ch1,ch2,ch3; puts("ch1 입력"); ch1 = getch(); putchar(ch1); puts("\nch2 입력"); ch2 = getch(); putchar(ch2); puts("\nch3 입력"); ch3 = getch(); putchar(ch3); puts( ) 는 \n' 이없어도출력후에자동으로줄이넘어간다. - 11 -
[ 예제 4.3-2] 문자열다루기 char s[20]; printf(" 문자열입력 :"); gets(s); puts(s); [ 예제 4.3-3] puts와 sprintf를이용한정수형변수의문자열다루기 sprintf : 정수와문자로구성된조합을문자열로변환해줌 //printf를이용한경우 int i; for(i=0;i<10;i++) printf("[%d] : %d\n",i,i); //puts 를이용한경우 #include<conio.h> int i; char str[10]; for(i=0;i<10;i++) sprintf(str,"[%d] : %d",i,i); puts(str); [ 응용예제-1] 문자입력시 **** 표시되도록수정 #include <conio.h> char ch; printf(" 문자입력 :"); ch=getch(); putch('*'); #include <conio.h> int i; char ch[4]; //char ch[5]; //ch[4]=null; printf(" 비밀번호입력 :"); for(i=0;i<4;i++) ch[i]=getch(); putch('*'); printf("\n"); puts(ch); - 12 -
[ 응용예제-2] 비밀번호확인프로그램구현 #include<string.h> #include<conio.h> #include<string.h> #include<conio.h> int i; char PW[4]="1234"; char InPW[4]; printf(" 비밀번호입력 : "); for(i=0;i<4;i++) InPW[i]=getch(); putch('*'); if(strcmp(pw,inpw)==0) else printf("\n 성공\n"); printf("\n 실패\n"); int i; char PW[5]="1234"; char InPW[5]; InPW[4]='\0'; printf(" 비밀번호입력 : "); for(i=0;i<4;i++) InPW[i]=getch(); putch('*'); if(strcmp(pw,inpw)==0) else printf("\n 성공\n"); printf("\n 실패\n"); strcmp(a,b) : NULL문자전까지두문자열비교 - 13 -