Upload
habib
View
53
Download
3
Embed Size (px)
DESCRIPTION
제 6 장 배열과 문자열. 문봉근. 제 6 장 배열과 문자열. 6.1 배열의 표현과 선언 6.2 1 차원 배열 6.3 다차원 배열 6.4 문자배열 ( 문자열 ) 6.5 배열 크기 정의 6.6 배열과 함수. 6.1 배열의 표현과 선언. 종류가 같은 데이터를 여러 개 선언 데이터 형이 같은 많은 양의 데이터를 처리하고자 할 때 사용 다른 변수들과 마찬가지로 반드시 먼저 선언이 되어야 한다. 6.1.1 배열의 표현. - PowerPoint PPT Presentation
Citation preview
1/64YES C 제 6 장 배열과 문자열
제제 66 장 배열과 문자열장 배열과 문자열
문봉근
2/64YES C 제 6 장 배열과 문자열
제제 66 장 배열과 문자열장 배열과 문자열6.1 6.1 배열의 표현과 선언배열의 표현과 선언6.2 16.2 1 차원 배열차원 배열6.3 6.3 다차원 배열다차원 배열6.4 6.4 문자배열문자배열 (( 문자열문자열 ))
6.5 6.5 배열 크기 정의배열 크기 정의6.6 6.6 배열과 함수배열과 함수
3/64YES C 제 6 장 배열과 문자열
6.1 배열의 표현과 선언• 종류가 같은 데이터를 여러 개 선언• 데이터 형이 같은 많은 양의 데이터를
처리하고자 할 때 사용• 다른 변수들과 마찬가지로 반드시 먼저
선언이 되어야 한다 .
4/64YES C 제 6 장 배열과 문자열
6.1.1 배열의 표현
• 배열은 여러 개의 데이터를 일련의 장소에 저장하므로 첨자 (index) 로 구별한다 .
• 첨자를 나타내기 위해서 []( 대괄호 , square bracket) 을 사용한다 .
• Ex : int names[4]; // 4 개의 데이터를 가지는 배열선언 .names[0] = 101; // 첫 번째 요소names[1] = 232; // 두 번째 요소names[2] = 231; // 세 번째 요소names[3] = 0; // 네 번째 요소
5/64YES C 제 6 장 배열과 문자열
예제 6.1 배열의 각 요소에 하나씩 문자 넣기
• #include <stdio.h>•
void main(void)• {• char word[20];
• word[0] = 'H';• word[1] = 'e';• word[2] = 'l';• word[3] = 'l';• word[4] = 'o';• word[5] = ‘\0’; /* 문자배열의 끝을 표시 */• printf("word[] 에 담겨진 내용은 -->%s\n", word );• }• 실행결과
– word[] 에 담겨진 내용은 Hello
6/64YES C 제 6 장 배열과 문자열
6.1.2 배열의 선언
• 배열의 선언 ( 문법 )– 데이터형 배열명 [ 요소의 개수 ];– data_type array_name[index];
• data_type : 배열의 데이터 형– 기본 데이터형 (int, float, char 등 )– 사용자 정의 데이터형 ( 구조체 , 공용체 등 )
• array_name : 배열명 ( 변수 정의 규칙에 따름 )• index : 배열의 요소의 개수
7/64YES C 제 6 장 배열과 문자열
예제 6.2 기본 배열의 선언을 위한 예제#include <stdio.h>
void main(void)
{
int numbers[100];
/* 100개의 요소를 가진 정수 배열 선언 */float averages[20];
/* 20개의 요소를 가진 실수 배열 선언 */
numbers[2] = 10; /* 세 번째 요소에 10을 저장 */--numbers[2]; /* 저장된 값 (10)을 1 감소 */printf("배열 numbers의 세 번째 요소는 %d이다 .",
numbers[2]);
}
실행결과배열 numbers의 세 번째 요소는 9이다 .
8/64YES C 제 6 장 배열과 문자열
6.2.1 1 차원 배열의 선언
• 1 차원 배열은 배열의 index 가 1 개인 배열을 말한다 .
• 문법– 데이터형 배열명 [ 요소의 개수 ];– int array[10];
9/64YES C 제 6 장 배열과 문자열
예제 6.3 array 라는 배열을 선언하고 , 지정된 요소에 데이터 넣기
• int a[10]; a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
a[6]
a[7]
a[8]
a[9]
• int a = 3, array[10];• array[a] = 100;• array[9] = 200;• array[10] = 400;
• 설명 – array[10] = 400 인 경우 에러 가능성 있음
10/64YES C 제 6 장 배열과 문자열
예제 6.4 1 차원 배열의 초기화 및 선언 예
⑴ int a[10] = { 10, 30, 50, 70, 100, 40, 30, 55, 223, 765 };
⑵ int b[] = { 10, 30, 50, 70, 100, 40, 30, 55, 223, 765 };
⑶ int c[10] = { 10, 30, 50, 70, 100, 40, 30, };
/* 숫자 뒤에 콤마가 있다 .*/
⑷ int d[3] = { 1, 10, 5, 7, 8 };
⑸ char ch[5] = "Test";
⑹ int numbers[10];
⑺ static int numbers[10] = { 34, 27, 16 };
⑻ static int numbers[] = { 2, -3, 45, 79, -14, 5, 9, 28, -1, 0};
⑼ static char text[] = "Welcome to Korea.";
⑽ static float radix[12] = { 134.362, 1913.248 };
⑾ double radians[1000];
11/64YES C 제 6 장 배열과 문자열
예제 6.5 배열 선언시 초기화한 후 , 출력하는 프로그램 .
#include <stdio.h>
void main(void)
{
int x;
static int values[] = { 1,2,3,4,5,6,7,8,9 };
static char word[] ={ 'H','e','l','l','o' };
for( x = 0; x < 9; ++x )
printf("values[%d] = %d\n", x, values[x]);
for( x = 0; x < 5; ++x )
printf("word[%d] = %d\n", x, word[x]);
}
12/64YES C 제 6 장 배열과 문자열
예제 6.6 1 차원 배열을 이용한 합계계산 프로그램
#include <stdio.h>
void main(void)
{
int i, data[] = {78,55,99,75,84,39,67,98,87,100};
/* 배열 선언 */
long int sum = 0; /* 초기 값을 0 으로 둔다 . */
float ave;
for (i = 0; i < 10; i++)
sum += data[i];
ave = (float)sum / 10.0;
printf("Total = %ld Average = %.2f\n", sum, ave);
}
13/64YES C 제 6 장 배열과 문자열
예제 6.7 년 , 월 , 일을 입력하여 1 월 1 일부터 입력한 날짜까지의 전체일수를 계산하는 프로그램
• #include <stdio.h>
• void main(void)• {• int year, month , day;• int days; /* 전체 날수를 기억 */• int ia[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };• printf(" 년도를 입력하시오 : "); scanf("%d",&year);• printf(" 월을 입력하시오 : "); scanf("%d",&month);• printf(" 일을 입력하시오 : "); scanf("%d",&day);
• if(day > 31) {• printf(" 에러 : 일이 잘못 입력되었습니다 .\n");• return;• }• else if(month==4 && month==6 && month==9 && month==11 && day>30 ) {• printf(" 에러 : 일이 잘못 입력되었습니다 .\n");• return;• }
14/64YES C 제 6 장 배열과 문자열
예제 6.7( 계속 )
• else if(month == 2) {• if(year%400==0 || (year%4==0 && year%100 !=0)) {• if( day > 29 ) {• printf(" 에러 : 일이 잘못 입력되었습니다 .\n");• return;• }• }• else {• if( day > 28 ) {• printf(" 에러 : 일이 잘못 입력되었습니다 .\n");• return;• }• }• }
• if (month >= 1 && month <= 12) {• days = ia[month-1] + day; /* 날수를 계산 */• if (month>2 && (year%400==0 || (year%4==0 && year%100 !=0)))• ++days; /* 윤년이고 3 월 이후면 하루를 증가 */• printf("%d 년 %d 월 %d 일은 %d 번째 날입니다 .\n",• year, month, day, days);• }• else• printf(" 에러 : 월이 잘못 입력되었습니다 !\n");• }
15/64YES C 제 6 장 배열과 문자열
예제 6.8 입력된 수들의 ~
• #include <stdio.h>
• void main(void)• {• int ia[10] = { 0, }; /* 초기 값이 모두 0 */• int i;• printf("0 에서 99 사이의 값들을 입력하시오 . 그 이외의 값이면 종료 .\n");• scanf("%d",&i);• while (i >= 0 && i <= 99) {• ++ia[i / 10];• scanf("%d",&i);• }• printf("\n 발생 빈도수 \n");• for (i = 0; i < 10; i++)• printf("%2d ~ %2d : %3d\n",i*10,(i+1)*10-1,ia[i]);• }
16/64YES C 제 6 장 배열과 문자열
예제 6.9 N 개의 정수를 읽어 들여 오름차순으로 정렬하는 프로그램 . 미리 100개의 배열을 잡아두고 입력할 데이터의 개수를 받아들인 후 계산한다 .
/* N 은 100 을 넘지 않는다 */
#include <stdio.h>
void main(void)
{
static int data[100];
int i, j, N;
printf(" 입력할 데이터의 개수를 입력하시오 : "); scanf("%d",&N);
for (i = 0; i < N; i++) /* 배열의 입력 */ scanf("%d",&data[i]);
17/64YES C 제 6 장 배열과 문자열
for (i = 0; i < N-1; i++)
for (j = i + 1; j < N; j++)
if (data[i] > data[j]) {
/*XOR 를 이용한 데이터 교환 */
data[i] ^= data[j];
data[j] ^= data[i];
data[i] ^= data[j];
}
printf(" 정렬된 데이터 :\n"); for (i = 0; i <= N - 1; i++) {
/* 정렬된 배열을 출력 */ printf("%10d",data[i]);
if ((i + 1) % 7 == 0)
printf("\n");
}
}
예제 6.9 ( 계속 )
18/64YES C 제 6 장 배열과 문자열
예제 6.10 데이터를 읽어 그 중 가장 긴 라인의 길이와 그 라인 전체를 출력하는 프로그램• #include <stdio.h>
• char data[250];
• void main(void)• {• char mdata[250]; /* 지금까지 읽은 라인 중 가장 긴 라인을 기억시킬 배열 */• int max = 0;• int l, i;• while (1) { /* 한 줄을 읽음 */• l=0;• while(1) {• data[l] = getchar();• if(data[l] == '\n' || data[l] == EOF) break;• l++;• }
• if (l > max) { /* 이것이 현재 라인 보다 길면 */• for (i = 0; i <= l - 1; i++)• mdata[i] = data[i]; /* 그대로 복사 */• max = l - 1;• }• if(data[l] == EOF) break;• }• if (max == 0) /* 읽어들인 라인이 없으면 */• printf(" 데이터가 없습니다 .\n");• else {• printf(" 가장 긴 줄은 : ");• for (i = 0; i <= max - 1; i++)• putchar(mdata[i]);• printf("\n 길이 : %d\n",max);• }• }
19/64YES C 제 6 장 배열과 문자열
예제 6.11 10 명의 ~
• #include <stdio.h>• #include <conio.h>
• void main(void)• {• int jumsu[10], sum=0, avg=0, i;• for(i=0;i<10;i++)• {• printf("input(jumsu %d )=>",i+1);• scanf("%d",&jumsu[i]);• printf("\n");• }• for(i=0;i<10;i++)• sum += jumsu[i];• printf("total = %d , avg = %d\n",sum, sum/i);• }
20/64YES C 제 6 장 배열과 문자열
예제 6.12 0 에서 9 까지 제곱의 값을 배열에 기억시켜 출력하는 프로그램을 작성하라 .
• #include <stdio.h>• #include <conio.h>
• void main(void)• {• int i, mul[10];• printf(" 제곱의 합 출력 프로그램 \n");• for(i=0;i<10;i++)• mul[i]=i*i;• for(i=0;i<10;i++)• printf("%d * %d = %2d\n“,i,i,mul[i]);• getch();• }
21/64YES C 제 6 장 배열과 문자열
6.2.2 1 차원 배열의 초기화
① 데이터 초기값을 선언시에 미리 대입하는 방법 int arr[4]={10,20,30,40}; char ab[3]={'A','B','C'};
② loop 를 이용하여 배열의 모든 값들을 0 으로 초기화하는 방법 int array[10]; for(i=0;i<10;i++) array[i] = 0;
③ 선언된 배열에 사용자가 직접 외부로부터 입력하는 방법 int a[10]; for(i=0;i<10;i++){ printf("\n input a[%d] = ", i); scanf("%d",&a[i]); }
22/64YES C 제 6 장 배열과 문자열
예제 6.13 1 차원 배열 x[20] 을 선언하고 , 초기값으로 2 의 배수를 저장하는 프로그램
• #include <stdio.h>
• void main(void)• {• int x[10], i;
• for(i=0;i<10;i++)• x[i]=i*2;• for(i=0;i<10;i++)• printf("x[%d] = %2d\n",i, x[i]);• }
23/64YES C 제 6 장 배열과 문자열
6.3 다차원 배열 • 다차원 배열 (multi dimensional arrays)
– 배열의 요소를 지정하는 두 개 이상의 index를 가진다 .
• int multi[2][3]; 과 같이 선언했을 경우
– 행우선 배열
– 열우선 배열
[0][0] [0][1] [0][2] [1][0] [1][1] [1][2]
[0][0] [1][0] [0][1] [1][1] [0][2] [1][2]
24/64YES C 제 6 장 배열과 문자열
6.3.1 다차원 배열의 선언과 계산 •다차원 배열의 선언
int m1[10][10];
float matrix[4][4][4];
static int m2[2][2] = { {0,1}, {2,3} };
sum = m1[i][j] + m2[k][l];
25/64YES C 제 6 장 배열과 문자열
다차원 배열을 초기화하거나 배열의 첨자를 사용하는 방법
① 다차원 배열에 초기값을 저장하는 방법 int a[2][3]={10,20,30,40,50,60};
int a[2][3]={{10,20,30},{40,50,60}};
② 배 열 을 먼 저 선 언 하 고 반 복 문 (for) 을 이용하여 배열을 0 으로 초기화하는 방법
int array[5][4];
for(i=0;i<5;i++)
for(j=0;j<4;j++)
rray[i][j] = 0;
26/64YES C 제 6 장 배열과 문자열
③ 배열을 먼저 선언하고 , 이 배열에 외부로부터 입력을 통해서 받아들이는 방법
int a[5][4];
for(i=0;i<5;i++)
for(j=0;j<4;j++){
printf("\n input[%d][%d] :", i, j);
scanf("%d",&a[i][j]);
}
④ 다차원 배열의 내용을 보기 위하여 출력하는 방법
int a[3][4] = { {10,20,30,40}, {50,60,70,80},
{90,100,110,120} };
for(i=0;i<3;i++)
for(j=0;j<4;j++)
printf("a[%d][%d] = %d ", i, j, a[i][j]);
27/64YES C 제 6 장 배열과 문자열
예제 6.14 다차원 배열의 초기화
⑴ int ia[2][3] = {{1,2,3}, {4,5,6}};
⑵ int ia[][3] = {1,2,3,4,5,6};
⑶ int ia[][] = {1,2,3,4,5,6}; /* 에러 */ ⑷ int ja[2][3][2] = {{{1,2},{3,4},{5,6}},
{{7,8},{9,10},{11,12}}};
⑸ int ja[][3][2] = {1,2,3,4,5,6,7,8,9,10,
11,12};
28/64YES C 제 6 장 배열과 문자열
예제 6.15 3*3 행렬 2 개를 읽어 들여 이의 합을 출력하는 프로그램
• #include <stdio.h>
• void print_matrix(int M[3][3])• {• int i, j;• for (i = 0; i < 3; i++) {• for (j = 0; j < 3; j++)• printf("%d ",M[i][j]);• printf("\n");• }• }
• void read_matrix(int M[3][3]) /* 3*3 행렬을 읽어 들이는 함수 */• {• int i, j;• for (i = 0; i < 3; i++)• for (j = 0; j < 3; j++)• scanf("%d",&M[i][j]);• }
29/64YES C 제 6 장 배열과 문자열
예제 6.15 3*3 행렬 2 개를 읽어 들여 이의 합을 출력하는 프로그램( 계속 )
• void main(void)• {• int A[3][3], B[3][3], C[3][3];• int i, j;
• printf("*** Input the first matrix(3*3) ***\n");
• /* read matrix A */• for (i = 0; i < 3; i++)• for (j = 0; j < 3; j++)• scanf("%d",&A[i][j]);
• /* printf matrix A : 함수로 했을 경우 배열의 이름을 인자로 전달한다 */• printf("\t## A ##\n");• for (i = 0; i < 3; i++) {• for (j = 0; j < 3; j++)• printf("%d ",A[i][j]);• printf("\n");• }
30/64YES C 제 6 장 배열과 문자열
예제 6.15 3*3 행렬 2 개를 읽어 들여 이의 합을 출력하는 프로그램( 계속 )
• printf("*** Input the second matrix(3*3) ***\n");• /* read matrix B */• for (i = 0; i < 3; i++)• for (j = 0; j < 3; j++)• scanf("%d",&B[i][j]);
• /* printf matrix B : 함수로 했을 경우 배열의 이름을 인자로 전달한다 */• printf("\t## B ##\n");• for (i = 0; i < 3; i++) {• for (j = 0; j < 3; j++)• printf("%d ",B[i][j]);• printf("\n");• }
• for (i = 0; i < 3; i++)• for (j = 0; j < 3; j++)• C[i][j] = A[i][j] + B[i][j];• • printf("\n*** C = A + B ***\n");• /* printf matrix C : 함수로 했을 경우 배열의 이름을 인자로 전달한다 */• printf("\t## C ##\n");• for (i = 0; i < 3; i++) {• for (j = 0; j < 3; j++)• printf("%2d ",C[i][j]);• printf("\n");• }• }
31/64YES C 제 6 장 배열과 문자열
예제 6.16 2 차원 배열의 초기화하는 예제
• #include <stdio.h>
• void main(void)• {• int array[4][3] = {{100, },{0, } ,{111, 222}, };• int i, j;
• for(i = 0; i < 4; i++)• {• for(j = 0; j < 3; j++)• printf("array[%d][%d] = %d\n", i, j, array[i][j]);• putchar('\n');• }• }
32/64YES C 제 6 장 배열과 문자열
예제 6.17 2 차원 배열의 초기화 및 행의 크기가 지정되지 않은 배열에서 행의 크기를 계산하는 프로그램 #include <stdio.h> void main(void) { int A[ ][3] = {{100,200,0},{0,},
{111,0,0}, {0,}}; int i, j, size; size = sizeof(A)/sizeof(int)/3; for(i = 0; i < size; i++) { for(j=0; j<3; j++)
printf("A[%d][%d] = %d\n",i, j, A[i][j]);
putchar('\n'); } }
33/64YES C 제 6 장 배열과 문자열
예제 6.18 행과 열의 ~
• /* 2 차원 배열 array[3][5] 의 각 행의 합과 전체 합을 계산하는 프로그램 */
• #include <stdio.h>• #define ROW 3• #define COLUMN 5•
• void main(void)• {• int array[ROW][COLUMN];• int i, j;• long temp, total = 0;•
34/64YES C 제 6 장 배열과 문자열
예제 6.18 행과 열의 ~( 계속 )
• for(i = 0; i < ROW; i++)• {• temp = 0;• for(j = 0; j < COLUMN; j++)• {• printf("Input data in array[%d][%d] : ", i, j);• scanf("%d", &array[i][j]);• temp += array[i][j];• }• switch( i ) /* 각 행의 합을 출력 */• {• case 0: printf("\narray[%d] = %ld\n\n", i, temp);• break;• case 1: printf("\narray[%d] = %ld\n\n", i, temp);• break;• case 2: printf("\narray[%d] = %ld\n\n", i, temp);• } /* end of switch */• total += temp;• } /* end of for statement */• printf("The total of array is %ld \n", total);• }
35/64YES C 제 6 장 배열과 문자열
예제 6.19 주어진 2 차원 배열에서 , 모든 요소들의 합을 계산하고 , total 을 출력하는 프로그램을 작성하라 .
#include <stdio.h> void main(void) { static int m[][] = { {10,5,-3}, {9, 0, 0},
{32,20,1}, {0,0,8} };
int row, column, sum; sum = 0; for( row = 0; row < 4; row++ ) for( column = 0; column < 3; column++ ) sum = sum + m[row][column]; printf("The total is %d\n", sum ); } 실행결과
The total is 82
36/64YES C 제 6 장 배열과 문자열
6.4.1 문자배열
• 문자열을 처리하는 방법– 문자배열 (character arrays) 을 사용하는 방법– 포인터를 사용하는 방법
37/64YES C 제 6 장 배열과 문자열
(1) 문자열 상수
• 문자열 상수는 “…”로 문자열을 묶어 주기만 하면 된다 .
주 소 0x01 0x02 0x03 0x04 0x05 0x06 0x07 ASCII 코드 0x53 0x74 0x72 0x69 0x6E 0x67 0x00 문 자 S t r i n g (NULL) ( 주소는 임의로 정한 주소임 )
• 문자열의 마지막에는 NULL 문자열이 들어간다 .
38/64YES C 제 6 장 배열과 문자열
(2) 문자열 변수
• C 에 서 는 문 자 열 데 이 터 형 이 없 으 므 로 문 자 배 열 을 사용하여 문자열 처리를 한다 .
• 문자배열– char 배열이름 [ 문자열길이 +1] = “ 초기문자열” ;
• 문법– 배열이름 [ 첨자 ] = 값– 변수 = 배열이름 [ 첨자 ]
39/64YES 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'; */
40/64YES C 제 6 장 배열과 문자열
(3) 문자열 상수의 초기화
• const char str[10]="String"; • const char str[]="String";
41/64YES 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); } 실행결과welcomeWelcome
42/64YES C 제 6 장 배열과 문자열
(4) 특수 문자
문자 기능\a Beep 음을 컴퓨터 스피커로 출력\b Back space\n 현재 위치한 줄의 다음 줄로 내려간다 .\r 현재 위치한 줄의 맨 처음으로 간다 .\t 수평 Tab\v 수직 Tab\\ \(역슬래쉬 )\‘ 작은 따옴표\“ 큰 따옴표\0 NULL 문자\0?? 8 진수 ?? 에 대한 문자\x?? 16 진수 ?? 에 대한 문자 .
43/64YES 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"); }
44/64YES 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
45/64YES C 제 6 장 배열과 문자열
6.4.2 문자분류 및 문자변환 표준함수 ( 계속 )
함수 설명toascii(int a) ASCII 로 변환tolower(int a) 소문자로 변환toupper(int a) 대문자로 변환char *strupr(char *s) 문자열을 대문자로 변환char *strlwr(char *s) 문자열을 소문자로 변환
46/64YES C 제 6 장 배열과 문자열
예제 6.22 toupper() 를 사용하여 문자열을 한번에 한 문자씩 대문자로 변환하는 예제 .
#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);}
47/64YES C 제 6 장 배열과 문자열
예제 6.23 예제 6.22 를 strupr 함수를 사용하여 한꺼번에 대문자로 바꾸기 #include <stdio.h> #include <ctype.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 ); }
48/64YES C 제 6 장 배열과 문자열
표 6.4 보이는 문자 (visible graphic character)
구분 해당 문자alphabet A~Z, a~z
digit 0~9
underscore _
punctutation! " # % & ' ( ) * + , -
. / : ; < = > ? [ \ ] ^ { | } ~
49/64YES C 제 6 장 배열과 문자열
표 6.5 추가 그래픽 문자(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
50/64YES C 제 6 장 배열과 문자열
표 6.6 제어 문자 (escape sequence)
문자 기능“ \”
‘ \’
? \?
\ \\
BEL \a
BS \b
FF \f
NL \n
CR \r
HT \t
VT \v
51/64YES C 제 6 장 배열과 문자열
표 6.7 숫자를 이용한 제어 문자(numerical escape sequence)
표시 기능\d or \dd or \ddd 10 진수 escape sequence
\xh or \xhh 16 진수 escape sequence\0oo or \0ooo 8 진수 escape sequence
52/64YES 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");
53/64YES 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(); }
54/64YES 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 으로 변환
55/64YES 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); 이 부분은 컴파일 시 에러가 난다 . 문자열은 덧셈을 할 수 없으며 , 어떤 컴파일러에서는 되는 곳도 있다 .*/
56/64YES C 제 6 장 배열과 문자열
예제 6.25( 계속 )
printf("%f\n", atof(string1) + atof(string2));
/* 실수로 변환이 되었으므로 연산이 가능하다 . */ /* printf("%s", string3 + string4);
마찬가지로 에러가 발생한다 .*/ printf("%d\n",
atoi(string3) + atoi(string4)); /* 정수로 변환이 되었으므로 연산이 가능하다 . */ } 실행결과
55.9680001438
57/64YES 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 으로 형식화된 출력 쓰기
58/64YES 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)스트링으로부터 형식화된 입력 읽기
59/64YES 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
60/64YES 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 가 마지막으로 발견되는 위치 찾기
61/64YES C 제 6 장 배열과 문자열
예제 6.26 문자 배열을 이용하여 문자열을 저장하는 방법
• #include <stdio.h>
• void main(void)• {• static char name1[] = {'H','e','l','l','o'};• static char name2[] = "Hello";• printf("%s\n", name1);• printf("%s\n", name2);• }
• 실행결과 ( 첫 번째의 경우는 아래와 같이 나오지 않을 수도 있다 .)– Helloxghifghjkloqw30-=kl`'– Hello
62/64YES C 제 6 장 배열과 문자열
예제 6.27 문자 배열에 데이터를 저장하는 방법과 출력하는 방법
• #include <stdio.h>• #include <string.h>
• void main(void)• {• char word[20];
• strcpy( word, "Hi there." );• printf("%s\n", word );• }
• 실행결과– Hi there.
63/64YES 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");
64/64YES 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(); }