개정판 누구나 즐기는 C언어 콘서트 제10장 문자열 출처: pixabay
이번 장에서 학습할 내용 문자 표현 방법 문자열 표현 방법 문자열이란 무엇인가? 문자열의 입출력 문자처리 라이브러리 함수 인간은 문자를 사용하여 정보를 표현하므로 문자열은 프로그램에서 중요한 위치를 차지하고 있다. 이번 장에서는 C에서의 문자열 처리 방법에 대하여 자세히 살펴볼 것이다. 문자 표현 방법 문자열 표현 방법 문자열이란 무엇인가? 문자열의 입출력 문자처리 라이브러리 함수 표준입출력 라이브러리 함수
이번 장에서 만들 프로그램
문자의 중요성 문자열(string)은 “Hello”와 같이 문자들의 모임이다. "A" "Hello" "Mr. Hong"
문자열 표현 방법 char str[6] = "Hello";
문자표현방법 컴퓨터에서는 각각의 문자에 숫자코드를 붙여서 표시한다. 아스키코드(ASCII code): 표준적인 8비트 문자코드 0에서 127까지의 숫자를 이용하여 문자표현 유니코드(unicode): 표준적인 16비트 문자코드 전세계의 모든 문자를 일관되게 표현하고 다룰 수 있도록 설계
NULL 문자 문자열의 끝은 반드시 NULL 문자(null character)라는 특수한 값으 로 끝나야 한다. char str[6] = "Hello";
문자열 배열의 초기화 char str[6] = { 'H', 'e', 'l', 'l', 'o', '\0' };
예제 #1 #include <stdio.h> int main(void) { char str1[6] = "Seoul"; char str2[3] = { 'i', 's', '\0' }; char str3[ ] = "the capital city of Korea."; printf("%s %s %s\n", str1, str2, str3); return 0; }
예제 #2 #include <stdio.h> int main(void) { char str[] = "komputer"; printf("%s\n", str); str[0] = 'c'; return 0; }
예제 #3 #include <stdio.h> int main(void) { char str[] = "A barking dog never bites"; int i = 0; while (str[i] != 0) i++; printf("문자열 %s의 길이는 %d입니다.\n", str, i); return 0; }
문자 입출력
예제 #include <stdio.h> int main(void) { int ch; // 정수형에 주의 ch = getchar(); // 첫 번째 문자를 입력받는다. putchar(ch); // 문자를 출력한다. return 0; }
예제 #include <stdio.h> int main(void) { int ch; // 정수형에 주의 ch = getch(); // 첫 번째 문자를 입력받는다. putch(ch); // 문자를 출력한다. return 0; }
Lab: 도형 크기 변경 화면에 사각형이 그려져 있고 사용자가 ‘b’를 누르면 사각형의 크기 가 점점 커진다. 사용자가 ‘s’를 누르면 사각형의 크기가 작아진다. ‘q’를 누르면 프로그램이 종료되는 프로그램을 작성해보자.
Sol: #include <windows.h> #include <stdio.h> int main(void) { int ch; // 정수형에 주의 int width=200, height=200; HDC hdc = GetWindowDC(GetForegroundWindow()); while (1) { Rectangle(hdc, 100, 100, width, height); // 사각형을 그린다. ch = getch(); // 문자를 입력받는다. Rectangle(hdc, 0, 0, 800, 600); // 화면을 지운다. if (ch == 'b') { width += 10; height += 10; }
Sol: else if (ch == 's') { width -= 10; height -= 10; } else if (ch == 'q') { return 0;
문자열 입출력 라이브러리 함수 프로그램 …Hello World!... 입출력 함수 설명 int scanf("%s", s) int printf("%s", s) 배열 s[]에 저장되어 있는 문자열을 출력한다. char *gets_s(char *s, int length) 한 줄의 문자열을 읽어서 문자 배열 s[]에 저장한다. int puts(const char *s) 배열 s[]에 저장되어 있는 한 줄의 문자열을 출력한다. 프로그램 …Hello World!...
gets_s()와 puts() 문자열 입출력 표준 입력으로부터 엔터키가 나올 때까지 한 줄의 라인을 입력 문자열에 줄바꿈 문자('\n')는 포함되지 않으며 대신에 자동으로 NULL 문자('\0')를 추가한다. 입력받은 문자열은 buffer가 가리키는 주소에 저장된다.
gets()와 puts() 문자열 입출력 puts() str이 가리키는 문자열을 받아서 화면에 출력 NULL 문자('\0')는 줄바꿈 문자('\n')로 변경 char *menu = "파일열기: open, 파일닫기: close"; puts(str);
예제 #1 #include <stdio.h> int main(void) { char name[100]; char address[100]; printf("이름이 어떻게 되시나요? "); scanf("%s", name); printf("어디 사시나요? "); scanf("%s", address); printf("안녕하세요, %s에 사는 %s씨.\n", address, name); return 0; }
예제 #2 #include <stdio.h> int main(void) { char name[100]; char address[100]; printf("이름이 어떻게 되시나요? "); gets_s(name, 99); printf("어디 사시나요? "); gets_s(address, 99); printf("안녕하세요, %s에 사는 %s씨.\n", address, name); return 0; }
중간 점검 한줄의 텍스트를 입력받는 문장을 작성하라. 사용자로부터 하나의 단어를 입력받는 문장을 작성하라.
문자열 처리 라이브러리
문자열 길이: strlen()
예제 #include <stdio.h> #include <string.h> int main(void) { char s[] = "abcdefgh"; int len = strlen(s); printf("문자열 %s의 길이=%d \n", s, len); return 0; }
문자열 복사: strcpy() #include <stdio.h> #include <string.h> int main(void) { char src[] = "Hello"; char dst[6]; strcpy(dst, src); printf("복사된 문자열 = %s \n", dst); return 0; }
문자열 복사: strcpy()
문자열 연결 #include <stdio.h> #include <string.h> int main(void) { char s[11] = "Hello"; strcat(s, "World"); // s에 문자열 “World"를 붙인다. printf("%s \n", s); return 0; }
문자열 연결
문자열 비교 int strcmp( const char *s1, const char *s2 ); 반환값 s1과 s2의 관계 <0 s1이 s2보다 앞에 있다. s1이 s2와 같다. >0 s1이 s2보다 뒤에 있다.
예제 사용자로부터 문자열 2개를 받아서 비교하는 프로그램을 작성해보 자.
예제 #include <string.h> #include <stdio.h> int main(void) { char s1[80]; // 첫 번째 단어를 저장할 문자배열 char s2[80]; // 두 번째 단어를 저장할 문자배열 int result; printf("첫번째 단어를 입력하시오:"); scanf("%s", s1); printf("두번째 단어를 입력하시오:"); scanf("%s", s2); result = strcmp(s1, s2); if (result < 0) printf("%s가 %s보다 앞에 있습니다.\n", s1, s2); else if (result == 0) printf("%s가 %s와 같습니다.\n", s1, s2); else printf("%s가 %s보다 뒤에 있습니다.\n", s1, s2); return 0; }
문자열을 수치로 변환 #include <stdio.h> #include <stdlib.h> int main(void) { int i; double d; i = atoi("100"); printf("%d \n", i); d = atof("36.5"); printf("%f \n", d); return 0; }
문자열과 포인터 아래의 2 문장은 어떻게 다를까? char s[] = "HelloWorld"; // ① char *p = "HelloWorld"; // ②
예제 #include <stdio.h> int main(void) { char s[] = "HelloWorld"; char *p = "HelloWorld"; s[0] = 'h'; // 변경 가능하다. // p[0] = 'h'; // 이 문장을 실행하면 프로그램의 작동이 중지된다. printf("포인터가 가리키는 문자열 = %s \n", p); p = "Goodbye"; // 이것은 가능하다. 큰 장점이다. return 0; }
Lab: 좋아하는 과일을 맞추는 퀴즈 자신이 좋아하는 과일을 퀴즈로 내고 사용자가 맞출 때까지 되풀이 하는 프로그램을 작성해보자.
Sol: #include <stdio.h> #include <string.h> int main(void) { char key[] = "사과"; char buffer[80]; do { printf("내기 제일 좋아하는 과일은 무엇일까요? "); scanf("%s", buffer); } while (strcmp(key, buffer) != 0); printf("맞았습니다!"); return 0; }
Lab: 행맨 빈칸으로 구성된 문자열이 주어지고 사용자는 문자열에 들어갈 글 자들을 하나씩 추측해서 맞추는 게임
Sol: #include <stdio.h> int main(void) { char solution[100] = "meet at midnight"; char answer[100] = "____ __ ________"; char ch; int i; while (1) { printf("\n문자열을 입력하시오: %s \n", answer); printf("글자를 추측하시오: "); ch = getch(); for (i = 0; solution[i] != NULL; i++) { if (solution[i] == ch) answer[i] = ch; } if (strcmp(solution, answer) == 0) break; return 0;
도전문제 여러 개의 문자열 중에서, 하나를 정답으로 선택하도록 위의 프로그 램을 업그레이드하여 보자.
Lab: 단어 애나그램 게임 영어 단어를 이루는 글자들이 뒤죽박죽 섞인 것을 받아서 순서대로 재배치하는 게임을 애나그램 게임이라고 한다.
Sol: #include <stdio.h> #define SOL "apple" int main(void) { char s[100] = SOL; char ans[100]; int i, len; len = strlen(s); for (i = 0; i<len; i++) { int pos1 = rand() % len; int pos2 = rand() % len; char tmp = s[pos1]; s[pos1] = s[pos2]; s[pos2] = tmp; }
Sol: do { printf("%s의 원래단어를 맞춰보세요: ", s); scanf("%s", ans); } while (strcmp(ans, SOL) != 0); printf("축하합니다. \n"); return 0; }
문자열의 배열 char s[3][6] = { "init", "open", "close" };
예제 다음과 같은 메뉴를 2차원 문자 배열에 저장하고 화면에 출력하는 프로그램을 작성해보자.
예제 #include <stdio.h> int main(void) { int i; char menu[5][10] = { "init", "open", "close", "read", "write" }; for (i = 0; i < 5; i++) printf("%d 번째 메뉴: %s \n", i, menu[i]); return 0; }
Lab: 한영 사전의 구현 3차원 문자 배열을 이용하여 간단한 한영 사전을 구현하여 보자. 영 어 단어가 dic[i][0]에 저장된다. 한글 설명은 dic[i][1]에 저장된 다.
Sol: #include <stdio.h> #include <string.h> #define WORDS 5 int main(void) { int i, index; char dic[WORDS][2][30] = { { "book", "책" }, { "boy", "소년" }, { "computer", "컴퓨터" }, { "language", "언어" }, { "rain", "비" }, }; char word[30];
Sol: printf("단어를 입력하시오:"); scanf("%s", word); index = 0; for (i = 0; i < WORDS; i++) { if (strcmp(dic[index][0], word) == 0) printf("%s: %s\n", word, dic[index][1]); return 0; } index++; printf("사전에서 발견되지 않았습니다.\n");
Lab: 문자열의 정렬 문자열들을 알파벳 순으로 정렬할 수 있을까?
Sol: #include <stdio.h> #define SIZE 6 int main(void) { int i, k; char fruits[SIZE][20] = { "pineapple", "banana", "apple", "tomato", "pear", "avocado" };
Sol: for (k = 0; k < SIZE; k++) { for (i = 0; i < SIZE - 1; i++) { if (strcmp(fruits[i], fruits[i + 1]) > 0) { char tmp[20]; strcpy(tmp, fruits[i]); strcpy(fruits[i], fruits[i + 1]); strcpy(fruits[i + 1], tmp); } for (k = 0; k < SIZE; k++) printf("%s \n", fruits[k]); return 0;
Q & A