글
7장 문자열
§ 7장의 학습목표: 문자의 배열(char의 배열)
[문자열과 배열]
- 문자열
문자열: 문자들이 메모리의 연속적인 위치에 배치됨
널문자('0'로 종료됨 (널문자는 문자열 끝을 의미)
"korea" ->k o r e a \0 ....\0 : 00000000 (8bits)
- 문자열과 배열
문자열은 문자배열에 저장 가능
(문자배열의 크기 >= 문자 개수+1) 이어야 함
문자배열에 저장된 문자들이 '\0'으로 끝나지 않으면 문자열이 아님
[문자 배열 초기화]
- 문자열을 사용하지 않는 초기화
1. char s[4];
s[0] = 'd'; s[1]='a'; s[2]='y'; s[3]='\0';
2. char s[4] = {'d','a','y','\0'};
- 문자열 상수로 초기화
char s[5]="day"; .... 배열크기는 문자 개수보다 1이상 커야 함
char s[]="day"; .... 배열크기가 문자열 저장에 필요한 크기로 됨 = 4
- strcpy() 함수를 사용한 초기화
#include <string.h>
char s[4]; ... strcpy()함수 원형 선언 포함
...
strcpy(s, "day") ... 프로그램 내에서 문자배열에 문자열 복사
- 잘못된 예
s = "day"; ... 배열이라 절대 불가능하다
[문자열 입출력]
- 문자열 입출력
입력: scanf(), gets()
출력: printf(), puts()
- 문자열 입력
※ 배열인 경우에는 scanf("%s",a); ... &a 로 붙이지 마라!!!!
- 문자열 출력
[문자열 처리 함수]
- 인수로 문자열을 사용하는 함수 : 문자열 끝이 널문자로 끝나므로 배열 크기 인수 불필요
- 예) 문자열 길이 계산 함수
널문자는 문자열 길이에 포함되지 않음
널문자의 첨자가 문자열 길이와 같음
int strlen(const char s[])
{
int i = 0;
while (s[i] != '\0')
i++;
return i
}
- 예) 문자열 복사 함수
void strcpy(char s1[], const char s2[])
{
int i;
for (i=0; s2[] != '\0'; i++);
s1[i] = s2[i];
s1[i] = '\0';
}
[문자열 라이브러리 함수]
- 문자열 라이브러리 함수
표준 라이브러리 함수에서 문자열 처리 함수 제공
헤더파일: #include <string.h>
strcpy(s1,s2) 문자열 s2를 문자열 s1으로 복사
strcat(s1,s2) 문자열 s2를 문자열 s1뒤에 연결하여 붙임
strcmp(s1,s2) 문자열 s1과 s2를 사전식 비교
strlen(s1) 문자열 s1 길이
strncpy(s1, s2, n) 문자열 s2를 최대 n 문자까지 문자열 s1으로 복사
strncat(s1,s2,n) 문자열 s2를 최대 n 문자까지 문자열 s1뒤에 붙임
strncmp(s1,s2,n) 문자열 s1과 s2를 최대 n 문자까지 사전식 비교
- 예) strcat() 함수를 사용한 문자열 연결하기
char s1[13] = "pretty";
char s2[7] = "girl";
연습문제
연산 이름과 연산을 할 두 정수를 입력 받아서 주어진 연산 결과를 출력하는 프로그램 작성
연산 이름: add sub mul div(몫) mod(나머지) power(거듭제곱)
입력 형식
add 1 2 출력: 3
power 3 4 출력: 81
== 코딩 ==
#include <stdio.h>
#include <string.h>
#include <math.h>
§ 7장의 학습목표: 문자의 배열(char의 배열)
[문자열과 배열]
- 문자열
문자열: 문자들이 메모리의 연속적인 위치에 배치됨
널문자('0'로 종료됨 (널문자는 문자열 끝을 의미)
"korea" ->k o r e a \0 ....\0 : 00000000 (8bits)
- 문자열과 배열
문자열은 문자배열에 저장 가능
(문자배열의 크기 >= 문자 개수+1) 이어야 함
문자배열에 저장된 문자들이 '\0'으로 끝나지 않으면 문자열이 아님
[문자 배열 초기화]
- 문자열을 사용하지 않는 초기화
1. char s[4];
s[0] = 'd'; s[1]='a'; s[2]='y'; s[3]='\0';
2. char s[4] = {'d','a','y','\0'};
- 문자열 상수로 초기화
char s[5]="day"; .... 배열크기는 문자 개수보다 1이상 커야 함
char s[]="day"; .... 배열크기가 문자열 저장에 필요한 크기로 됨 = 4
- strcpy() 함수를 사용한 초기화
#include <string.h>
char s[4]; ... strcpy()함수 원형 선언 포함
...
strcpy(s, "day") ... 프로그램 내에서 문자배열에 문자열 복사
- 잘못된 예
s = "day"; ... 배열이라 절대 불가능하다
[문자열 입출력]
- 문자열 입출력
입력: scanf(), gets()
출력: printf(), puts()
- 문자열 입력
- 문자열 출력
[문자열 처리 함수]
- 인수로 문자열을 사용하는 함수 : 문자열 끝이 널문자로 끝나므로 배열 크기 인수 불필요
- 예) 문자열 길이 계산 함수
널문자는 문자열 길이에 포함되지 않음
널문자의 첨자가 문자열 길이와 같음
int strlen(const char s[])
{
int i = 0;
while (s[i] != '\0')
i++;
return i
}
- 예) 문자열 복사 함수
void strcpy(char s1[], const char s2[])
{
int i;
for (i=0; s2[] != '\0'; i++);
s1[i] = s2[i];
s1[i] = '\0';
}
[문자열 라이브러리 함수]
- 문자열 라이브러리 함수
표준 라이브러리 함수에서 문자열 처리 함수 제공
헤더파일: #include <string.h>
strcpy(s1,s2) 문자열 s2를 문자열 s1으로 복사
strcat(s1,s2) 문자열 s2를 문자열 s1뒤에 연결하여 붙임
strcmp(s1,s2) 문자열 s1과 s2를 사전식 비교
strlen(s1) 문자열 s1 길이
strncpy(s1, s2, n) 문자열 s2를 최대 n 문자까지 문자열 s1으로 복사
strncat(s1,s2,n) 문자열 s2를 최대 n 문자까지 문자열 s1뒤에 붙임
strncmp(s1,s2,n) 문자열 s1과 s2를 최대 n 문자까지 사전식 비교
- 예) strcat() 함수를 사용한 문자열 연결하기
char s1[13] = "pretty";
char s2[7] = "girl";

연습문제
연산 이름과 연산을 할 두 정수를 입력 받아서 주어진 연산 결과를 출력하는 프로그램 작성
연산 이름: add sub mul div(몫) mod(나머지) power(거듭제곱)
입력 형식
add 1 2 출력: 3
power 3 4 출력: 81
== 코딩 ==
#include <stdio.h>
#include <string.h>
#include <math.h>
int main(void)
{
int i, j;
char s [20];
double res;
printf("연산자와 두 정수를 입력하시오. ex)mod 4 3\n");
printf("(사용 가능 연산자: add, sub, mul, div, mod, power)\n");
scanf("%s %d %d", s, &i, &j);
while(strcmp(s, "$") != 0){
if(strcmp(s, "add") == 0)
res = i + j;
else if(strcmp(s, "sub") == 0)
res = i - j;
else if(strcmp(s, "mul") == 0)
res = i * j;
else if(strcmp(s, "div") == 0)
res = (double)i / j;
else if(strcmp(s, "mod") == 0)
res = i % j;
else if(strcmp(s, "power") == 0)
res = pow(i,j);
else
continue;
printf("%4d %s %4d = %10.2f\n", i, s, j, res);
scanf("%s %d %d", s, &i, &j);
}
return 0;
}
====