Transcript 11장

구조적 프로그래밍 기법을 위
한C
Chapter 11 문자열
문자열이란
• 문자열은 연속된 문자.
• 문자열을 구현한 모든 방식에서는 문자열을 가
상적으로 가변 길이 데이터라 간주.
• 문자열의 분류
문자열이란
• 고정길이 문자열
– 고정길이 문자열 포멧의 구현은 변수의 크기를 결정
– 변수의 크기가 너무 작으면 데이터를 저장할 수 없고,
너무 크면 메모리를 낭비한다.
• 가변길이 문자열
– 데이터를 수용하기 위해 확장과 축소가 가능한 구조
– 길이 조정 문자열이나 구분자를 사용
C 문자열
• 문자열 저장
– 문자열을 문자 배열에 저장할 때는 끝에 널 문자(\0)
로 표시한다.
– 문자열과 문자의 차이
C 문자열
• 문자열 정수
– 쌍따옴표로 묶인 연속된 문자
– 프로그램에서 문자열 정수를 사용하면, C는 자동으로
문자 배열을 생성하고 초기화한 후 내용을 저장한다.
• 문자열과 문자
– 문자 정수를 사용할 경우 따옴표(‘) 문자열 정수를 사
용할 경우 쌍따옴표(“)를 사용한다.
C 문자열
• 변수로 사용되는 문자열
– C에는 문자열 형식이 별도로 없으며, 문자열은 연속
된 문자이므로 자연히 문자배열이 된다.
– 문자열 초기화
• 문자열 초기화는 정의시 값을 할당함으로 가능하다.
– 예
• 구분자까지 포함한 10문자 문자열 정의
– char str[11];
• 문자열은 배열에 저장됨으로 정의시 초기화 하면 배열의 크
기를 지정할 필요 없다.
– char month[] = “January”;
• 포인터 변수를 이용한 문자열 저장
– char * pStr = “Good Day”;
C 문자열
• 문자열과 포인터
– 문자열의 이름 자체는 문자열의 첫번째요소를
가리키는 포인터 상수이다.
– 문자열에서 한 문자를 출력하기 위해서는 문
자 변환코드(%c)나 포인터 연산을 해야한다.
문자열 입/출력 함수
• 양식문자열 입력 : scanf()
– 문자열의 경우 문자열 변환 코드 %s 를 사용한다.
– 예
{
#define FLUSH while (getchar() != ‘\n’)
char month[10];
printf(“Please enter a month.”);
scanf(“%9s”, month);
Month는 포인터 상수이므로
FLUSH;
주소연산자가 필요없다.( &month )
}
문자열 입/출력 함수
• 양식문자열 출력 : printf()
– 입력과 마찮가지로 문자열 변환 코드 s 를 사용한다.
– 예
printf(“%30s\n”, “This is the string”);
문자열 입/출력 함수
• 문자열 입력 : gets/fgets
– 입력 스트림의 한 줄을 가져와 널 문자로 끝나는 문자열을 만든
다.
– gets는 표준입역 파일시스템에서 데이터를 입력받고 fgets는 파
일 포인터로 지정한 파일 스트림에서 데이터를 읽는다.
– 프로토 타입
char *gets (char *strPtr);
char *fgets (char *strPtr, int size, FILE *fp);
문자열 입/출력 함수
• 문자열 출력 : puts/fputs
– 메모리에서 널 문자로 끝나는 문자열을 가져와 출력한다.
– puts는 모니터와 같은 표준 출력 단위에 쓰이고 fputs는 파일로
의 출력에 쓰인다.
– 프로토 타입
int puts (const char *strPtr);
int *fputs (const char *strPtr, FILE *fp);
문자열 조작 함수
• 문자열은 표준형식이 아니므로 대부분의 C연산
에서 문자열을 직접 사용할 수가 없다.
• 따라서 문자열에 대한 조작은 C에서 제공하는
문자열 라이브러리(string.h)의 문자열 함수를 사
용한다.
• 문자열 함수
–
–
–
–
strlen() , strcpy() , strncpy() , strncmp()
strcat() , strncat() , strchr() , strrchr()
strstr() , strspn() , strcspn() , strpbrk()
strtok() , strtol()
문자열 조작 함수
• 문자열 길이(strlen)
– 널 문자를 제외한 문자열의 문자 개수를 반환
– 프로토타입
• int strlen (const char *string);
• 문자열 복사(strcpy)
– 널 문자를 포함한 원본 문자열을 목적지 문자
열로 복사
– 프로토타입
• char *strcpy (const char *string);
– 문자열의 길이가 서로 다를경우 strncpy()함수
를 사용
문자열 조작 함수
• 문자열 비교(strcmp)
– 두 문자열을 비교 결과를 정수로 반환
• 같으면(0)
• 첫번째 문자열이 두번째 문자열보다 작을경우 0보다 작은값
• 첫번째 문자열이 두번째 문자열보다 클경우 0보다 큰값
– 프로토타입
• int strcmp (const char *string1, const char *string2);
• 문자열 비교(strncmp)
– 문자열-길이 비교함수로 두 개의 문자열을 주어진 최
대 개수 만큼 비교
– 프로토타입
• int strncmp (const char *string1, const char *string2, int
size);
문자열 조작 함수
• 문자열 연결(strcat)
– 한 문자열을 다른 문자열의 끝에 추가
– 프로토타입
char strcat (char *string1, const char *string2);
• 문자열 비교(strncat)
– 한 문자열중 지정된 사이즈 만큼만 다른 문자
열의 끝에 추가
– 프로토타입
• char strncat(char *string1, const char *string2,
int size);
문자열 조작 함수
• 문자열에 있는 문자 검색(strchr,strrchar)
– 주어진 문자가 문자열에 있는지 검색하고 해
당 문자의 위치 포인터를 반환
– strchr()은 문자열의 처음부터 검색
– strrchar()은 문자열의 끝에서부터 검색
– 프로토타입
char *strchr (const char *string, int ch);
char *strrchar (const char *string, int ch);
문자열 조작 함수
• 문자열에 있는 문자열 검색(strstr)
– 주어진 문자열이 문자열에 있는지 검색하고
해당 문자열의 시작 포인터를 반환
– 프로토타입
char *strstr (const char *string, const char
*substring);
문자열 조작 함수
• 문자열 스팬
– 문자열에 있는 문자들의 집합을 찾는다.
– strspn
• 문자열에서 집합에 있는 문자를 검색하다 집합에 없는 문자
가 처음 나오면 중단
int strspn (const char *string1, const char *set);
– strcspn
• 문자열에서 집합에 있는 문자를 검색하다 집합에 있는 문자
가 처음 나오면 중단
int strcspn (const char *string1, const char *set);
– strpbrk
• 문자열에서 집합에 있는 문자를 검색하다 처음 찾아낸 문자
의 포인터를 반환
int strpbrk (const char *string1, const char *set);
– strtok
• 문자열에서 부분 문자열을 찾는 역할
int strtok (const char *string1, const char *delimiters);
문자열 조작 함수
• 문자열을 숫자로
– 문자열을 긴 정수형이나 긴 더블형으로 바꾼다
– strtol
• 문자열을 긴 정수형으로 바꾸는 함수
long strtol (char *str, char **ptr, int base);
– strtod
• 문자열을 더블형으로 바꾸는 함수
• 베이스가 없다는 것을 제외하고 strtol과 비슷
double strtod (char *str, char **ptr);
메모리 양식
• 메모리 문자열 입력(sscanf)
– sscanf()함수는 문자열을 키보드에서 들어오는 데이
터처럼 읽어들인다.
– scanf()에서 사용하는 모든 양식을 사용가능
– 프로토타입
• int sscanf(char *str, const char *format_string,…);
메모리 양식
• 메모리 문자열 출력(sprintf)
– sprintf()함수는 다대일 함수로 조각난 데이터들을 문
자열로 만든다.
– printf()와 같은 규칙을 따른다.
– 프로토타입
• int sprintf(char *out_string, const char *format_string,…);
소프트웨어 공학과 프로그래밍 스타일
• 프로그램 디자인 구상
– 좋은 디자인의 최우선적인 전체는 프로
그램이 모듈화 즉 구조적으로 디자인되
어 있는냐 하는 것이다.
– 프로그램 디자인 측정
• 모듈의 독립성
• 프로그램이 단일목적으로 되어 있는가.
소프트웨어 공학과 프로그래밍 스타일
• 정보은닉
– 자료구조와 함수의 구현내용을 사용자
가 알 수 없도록 하는것이 프로그램 디
자인 원칙.
– 묘듈들은 잘 정의된 매개 변수를 통해
통신할 뿐 서로 독립적이어야 한다.
– 은닉이란
• 서로 독립적이며 필요한 정보만으로 다른
통신하는 서로 다른 모듈의 집합을 정의함
으로써 효과적인 묘듈화를 이루는 것.
소프트웨어 공학과 프로그래밍 스타일
• 결합
– 서로 관련된 작업을 하나의 주요 함수로
합치는것.
– 결합 전제
• 정밀도,결합도,재활용성
– 결합의 7가지 단계