29
1 YES C 제 6 제 제제제 제제제 제제 제제 ( 제제 제제 ) • 제제 제제 제제 (5 제 17 제 ) : 6 제 제제 – 제제 제제 • 제제 (5 제 24 제 ) – 7 제 제제 • 제제 – 제제

강의 내용 ( 아홉 번째 )

Embed Size (px)

DESCRIPTION

강의 내용 ( 아홉 번째 ). 오늘 강의 내용 (5 월 17 일 ) : 6 장 배열 문자 배열 예습 (5 월 24 일 ) 7 장 함수 숙제 없음. 6.4 문자배열. 6.4.1 문자배열. 문자열을 처리하는 방법에는 문자배열 (character arrays) 을 사용하는 방법과 포인터를 사용하는 방법이 있다 . 여기서는 배열을 이용한 방법만을 배우기로 한다. 문자열 상수. 문자열 상수는 “ …” 로 문자열을 묶어 주기만 하면 된다 . - PowerPoint PPT Presentation

Citation preview

Page 1: 강의 내용 ( 아홉 번째 )

1YES C 제 6 장 배열과 문자열

강의 내용 ( 아홉 번째 ) • 오늘 강의 내용 (5 월 17 일 ) : 6 장 배열

– 문자 배열• 예습 (5 월 24 일 )

– 7 장 함수• 숙제

– 없음

Page 2: 강의 내용 ( 아홉 번째 )

2YES C 제 6 장 배열과 문자열

6.4 문자배열

Page 3: 강의 내용 ( 아홉 번째 )

3YES C 제 6 장 배열과 문자열

6.4.1 문자배열

• 문자열을 처리하는 방법에는 문자배열(character arrays) 을 사용하는 방법과 포인터를 사용하는 방법이 있다 .

• 여기서는 배열을 이용한 방법만을 배우기로 한다 .

Page 4: 강의 내용 ( 아홉 번째 )

4YES C 제 6 장 배열과 문자열

문자열 상수

• 문자열 상수는 “…”로 문자열을 묶어 주기만 하면 된다 .

주 소 0x01 0x02 0x03 0x04 0x05 0x06 0x07 ASCII 코드 0x53 0x74 0x72 0x69 0x6E 0x67 0x00 문 자 S t r i n g (NULL) ( 주소는 임의로 정한 주소임 )

• 문자열의 마지막에는 NULL 문자열이 들어간다 .

Page 5: 강의 내용 ( 아홉 번째 )

5YES C 제 6 장 배열과 문자열

문자열 변수

• C 에서는 문자열 데이터형이 없으므로 문자 배열을 사용하여 문자열 처리를 한다 .

char 배열이름 [ 문자열길이 +1]=“ 초기문자열” ;

Page 6: 강의 내용 ( 아홉 번째 )

6YES C 제 6 장 배열과 문자열

• 문자열을 복사할 때는 strcpy 함수를 이용하여야 하며 , 직접 대입할 수 없다 .

• 직접 대입을 할 경우는 하나씩 배열의 요소에 넣어야 한다 .char str[10] = "String"; strcpy( 문자배열이름 , 문자열 );strcpy(str,"Welcome!"); str="Hello!"; /* 이렇게 사용할 수는 없다 . */ str[0]='H';  /* 대입연산자를 사용할 경우는 일일이

이렇게 한 문자씩 대입한다 . */ str[1]='e'; str[2]='l'; str[3]='l'; str[4]='o'; str[5]='!'; str[6]=NULL; /* 또는 str[6]='\0'; */

Page 7: 강의 내용 ( 아홉 번째 )

7YES C 제 6 장 배열과 문자열

문자열 상수의 초기화

• const char str[10]="String"; • const char str[]="String";

Page 8: 강의 내용 ( 아홉 번째 )

8YES C 제 6 장 배열과 문자열

예제 6.20문자열 복사함수를 사용하는 방법과 하나의 배열 요소에 대입하는 방법 .

/* 파일 이름 : 문자열 처리 프로그램 . */ #include <stdio.h> #include <string.h> void main(void) {        char str[10];        strcpy(str,"welcome");        printf("%s\n",str);        str[0]='W';        printf("%s\n",str); }

Page 9: 강의 내용 ( 아홉 번째 )

9YES C 제 6 장 배열과 문자열

특수 문자

문자 기능\a Beep 음을 컴퓨터 스피커로 출력\b Back space\n 현재 위치한 줄의 다음 줄로 내려간다 .\r 현재 위치한 줄의 맨 처음으로 간다 .\t 수평 Tab\v 수직 Tab\\ \( 역슬래쉬 )\‘ 작은 따옴표\“ 큰 따옴표\0 NULL 문자\0?? 8 진수 ?? 에 대한 문자\x?? 16 진수 ?? 에 대한 문자 .

Page 10: 강의 내용 ( 아홉 번째 )

10YES C 제 6 장 배열과 문자열

예제 6.21 특수문자 처리하는 방법 . #include <stdio.h> void main(void) {        printf("C Programming\n");        printf("C \bProgramming\n");        printf("\'C\' Programming\n");        printf("\"C Programming\"\n");        printf("C \tProgramming\n");        printf("C \rProgramming\n");        printf("C\n\tProgramming\n");        printf("C Programming\a\n"); }

Page 11: 강의 내용 ( 아홉 번째 )

11YES C 제 6 장 배열과 문자열

6.4.2 문자분류 및 문자변환 표준함수함수 설명 해당문자

isalnum(int c) 알파벳 또는 숫자인가 ? A~Z, a~z, 0~9

isalpha(int a) 알파벳인가 ? A~Z, a~z

isascii(int a) ASCII 문자인가 ?

iscntrl(int a) 제어문자인가 ?BEL, BS, CR, FF, HT, NL, VT

isdigit(int a) 10 진수인가 ? 0~9

isgraph(int a) 그래픽 문자인가 ? isalnum or ispunctislower(int a) 소문자인가 ? a~z

isprintf(int a) 출력 가능한 문자인가 ? isgraph or isspace

ispunct(int a) 구두점 문자인가 ?! # % & ( ) ; < = > ? [ \ ] + , . / : ^ _ { | }

isspace(int a) 공백문자인가 ?CR, FF, HT, NL, VT, space

isupper(int a) 대문자인가 ? A~Z

isxdigit(int a) 16 진수인가 ? 0~9, A~F, a~f

Page 12: 강의 내용 ( 아홉 번째 )

12YES C 제 6 장 배열과 문자열

6.4.2 문자분류 및 문자변환 표준함수 ( 계속 )

함수 설명toascii(int a) ASCII 로 변환tolower(int a) 소문자로 변환toupper(int a) 대문자로 변환char *strupr(char *s) 문자열을 대문자로 변환char *strlwr(char *s) 문자열을 소문자로 변환

Page 13: 강의 내용 ( 아홉 번째 )

13YES C 제 6 장 배열과 문자열

예제 6.22toupper() 를 사용하여 문자열을 한번에 한 문자씩 대문자로 변환하는 예제 .

#include <stdio.h> #include <ctype.h> void main(void){    char name[80];    int loop;  printf("Enter in a name in lowercase\n");    scanf( "%s", name );    for( loop = 0; name[loop] != 0; loop++ )         name[loop] = toupper( name[loop] );  printf("The name in uppercase is %s", name);}

Page 14: 강의 내용 ( 아홉 번째 )

14YES C 제 6 장 배열과 문자열

예제 6.23예제 6.22 를 strupr 함수를 사용하여 한꺼번에 대문자로 바꾸기

#include <stdio.h> #include <string.h> void main(void) {    char name[80]; /*declare an array of characters 0-79*/

   printf("Enter in a name in lowercase\n");    scanf( "%s", name );    strupr( name );    printf("The name is uppercase is %s\n",name );    strlwr( name );    printf("The name is lowercase is %s\n",name ); }

Page 15: 강의 내용 ( 아홉 번째 )

15YES C 제 6 장 배열과 문자열

보이는 문자 (visible graphic character)

구분 해당 문자alphabet A~Z, a~z

digit 0~9

underscore _

punctutation! " # % & ' ( ) * + , -

. / : ; < = > ? [ \ ] ^ { | } ~

Page 16: 강의 내용 ( 아홉 번째 )

16YES C 제 6 장 배열과 문자열

추가 그래픽 문자(Additional graphic characters)

문자 기능space Blank space

BEL Bell( 경고음 )

BS Back space

FF Form feed

NL New line

CR Carriage return

HT Horizontal tab

VT Vertical tab

Page 17: 강의 내용 ( 아홉 번째 )

17YES C 제 6 장 배열과 문자열

제어 문자 (escape sequence)

문자 기능“ \”

‘ \’

? \?

\ \\

BEL \a

BS \b

FF \f

NL \n

CR \r

HT \t

VT \v

Page 18: 강의 내용 ( 아홉 번째 )

18YES C 제 6 장 배열과 문자열

숫자를 이용한 제어 문자(numerical escape sequence)

표시 기능\d or \dd or \ddd 10 진수 escape sequence

\xh or \xhh 16 진수 escape sequence\0oo or \0ooo 8 진수 escape sequence

Page 19: 강의 내용 ( 아홉 번째 )

19YES C 제 6 장 배열과 문자열

예제 6.24문자처리함수를 이용한 프로그램이다 . 그 결과를 분석해보자

#include <stdio.h> #include <ctype.h> #include <conio.h> void main(void) {        int c;        printf("\n isalpha : \n");        for(c=0;c<127;c++)               if(isalpha(c))putchar(c);        printf("\n isdigit :\n");        for(c=0;c<127;c++)               if(isdigit(c))putchar(c);        printf("\n islower :\n");

Page 20: 강의 내용 ( 아홉 번째 )

20YES C 제 6 장 배열과 문자열

예제 6.24( 계속 )

       for(c=0;c<127;c++)               if(islower(c))putchar(c);        printf("\n ispunct :\n");        for(c=0;c<127;c++)               if(ispunct(c))putchar(c);        printf("\n isupper :\n");        for(c=0;c<127;c++)               if(isupper(c))putchar(c);        getch(); }

Page 21: 강의 내용 ( 아홉 번째 )

21YES C 제 6 장 배열과 문자열

6.4.3 데이터 변환함수 기능

double atof(char *string) 스트링을 부동소수점으로 변환

int atoi(char *string) 스트링을 long integer 로 변환

char *itoa(int value, char *string, int radix)

정수를 주어진 기수법으로 스트링으로 변환

char *ltoa(long value, char *string, int radix)

long 정수를 주어진 기수법으로 스트링으로 변환

double strtod(char *string, char *endptr)

스트링을 double 부동소수점으로 변환

long strtol(char *string, char *endptr, int radix)

스트링을 주어진 기수법으로 long 정수로 변환

unsigned long strtoul(char *string, char *endptr, int radix)

스트링을 unsigned long 으로 변환

Page 22: 강의 내용 ( 아홉 번째 )

22YES C 제 6 장 배열과 문자열

예제 6.25문자열을 숫자 데이터형으로 변환하는 프로그램 . 문자열은 계산이 안되지만 숫자로 변환한 후에는 계산이 가능하게 된다 .

#include <stdio.h>

#include <stdlib.h>

void main(void) {

   char string1[] = "12.434";

   char string2[] = "43.534";

  char string3[] = "453", string4[] = "985";

  /* printf("%s", string1 + string2); 이 부 분 은 컴파일 시 에러가 난다 . 문자열은 덧셈을 할 수 없으며 , 어떤 컴파일러에서는 되는 곳도 있다 .*/

Page 23: 강의 내용 ( 아홉 번째 )

23YES C 제 6 장 배열과 문자열

예제 6.25( 계속 )

   printf("%f\n",atof(string1) + atof(string2));

/* 실수로 변환이 되었으므로 연산이 가능하다 . */

   /* printf("%s", string3 + string4);

마찬가지로 에러가 발생한다 .*/

   printf("%d\n",atoi(string3) + atoi(string4));

   /* 정수로 변환이 되었으므로 연산이 가능하다 . */

}

Page 24: 강의 내용 ( 아홉 번째 )

24YES C 제 6 장 배열과 문자열

6.4.4 스트림 입출력함수 기능

int fgetc(FlLE *file_pointer) 스트림으로부터 한 문자 가져오기

char *fgets(char *string, int maxchar, FILE *file_pointer)

파일로부터 스트링 읽기

int fputc(int c, FILE *file_pointer) 스트림에 한 문자 쓰기

int fputchar(int c) stdout 에 한 문자 쓰기

int fputs(char *string, FILE *file_pointer)

스트림에 스트링 쓰기

int getc(FlLE *file_pointer) 스트림으로부터 한 문자 읽기

int getchar(void) stdin 으로부터 한 문자 읽기

char *gets(char *buffer) stdin 으로부터 한 줄을 읽어서 버퍼에 넣기

int printf(const char *format, args); stdout 으로 형식화된 출력 쓰기

Page 25: 강의 내용 ( 아홉 번째 )

25YES C 제 6 장 배열과 문자열

6.4.4 스트림 입출력 ( 계속 )

함수 기능int putc(int c, FILE *file_pointer) 한 문자를 스트림에 쓰기int putchar(int c) stdout 에 한 문자 쓰기int puts(char *string) stdout 에 스트링 쓰기

int scanf(char *format_string, args)stdin 으로부터 형식화된 입력 읽기

int sprintf(char *string,

char *format_string, args)스트링에 형식화된 출력 쓰기

int sscanf(char *buffer,

char *format_string, args)스트링으로부터 형식화된 입력 읽기

Page 26: 강의 내용 ( 아홉 번째 )

26YES C 제 6 장 배열과 문자열

6.4.5 문자열 처리함수 기능

char *strcat(char *s1, const char *s2);

s1 에 s2 를 추가하고 s1 을 return

char *strchr(const char *s, int c);s 에서 c 가 발생하는 첫 번째 위치 찾기

int strcmp

(const char *s1, const char *s2)

s1 과 s2 를 비교 , 두 문자열 이 같으면 0, s1 이 크면 양수 , 아니면 음수를 return

int strcoll

(const char *s1, const char *s2);

s1 과 s2 비교 , s1 이 크면 양수 , 같으면 0, 아니면 음수를 return

char* strcpy(char *s1, const char *s2)

s2 에서 s1 로 스트링 복사

size_t strcspn

(const char *s1, const char *s2);

1 에서 s2 와 같은 문자열 검색 , 문자열이 있으면 위치 return

Page 27: 강의 내용 ( 아홉 번째 )

27YES C 제 6 장 배열과 문자열

6.4.5 문자열 처리 ( 계속 )

함수 기능char* strerror(int errcode) 특정한 에러번호에 해당하는 에러 메시지

획득 int strlen(const char *string) 스트링의 길이 획득

char* strncat

(const char *s1, const char *s2, size_t n)

s2 로부터 n 개의 문자를 s 에 추가

int strncmp

(const char *s1, const char *s2, size_t n)

두 스트링의 처음 n 개의 문자를 비교 , 두 문자열이 같으면 0, s1 이 크면 양수 , 아니면 음수를 return

char* strncpy

(char *s1, char *s2, size_t n)처음 n 개의 문자를 s2 에서 s1 로 복사

char* strrchr(char *s, int c)s 에서 문자 c 가 마지막으로 발견되는 위치 찾기

Page 28: 강의 내용 ( 아홉 번째 )

28YES C 제 6 장 배열과 문자열

예제 6.28문자열 처리 함수를 이용한 프로그램이다 .

#include <stdio.h> #include <conio.h> #include <string.h> void main(void){    char a[30],b[30],pass[10],s1[15],s2[15]; printf("/*strcat()=string1+string 2 */\n\n");   printf("input string 1:"); gets(a);    printf("input string 2:"); gets(b);   printf("\n\n string1 + string2 = %s \n",

strcat(a,b));    printf("\n\n/* strcmp() = compare string1 with

string2 */ \n");    printf("\n\nif your password is....h6614 \n");

Page 29: 강의 내용 ( 아홉 번째 )

29YES C 제 6 장 배열과 문자열

예제 6.28( 계속 )

   do{       printf("Your Password : "); gets(pass);       if(strcmp(pass,"h6614"))            printf("invalid password\n");       else            break;    } while(1);

   printf("\n O.K");    getch();   printf("\n/*strcpy(s1,s2)=Copy s2 to s1*/ \n");

   printf("input string s2 :"); gets(s2);    strcpy(s1,s2);    printf("s1 = %s\n",s1);    getch(); }