처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 9 장 문자열.

Slides:



Advertisements
Similar presentations
Chapter 12. 배열. 배열  동일한 항목들이 동일한 크기로 연속적으로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는 자료 구조.
Advertisements

6 장. printf 와 scanf 함수에 대한 고찰 printf 함수 이야기 printf 는 문자열을 출력하는 함수이다. – 예제 printf1.c 참조 printf 는 특수 문자 출력이 가능하다. 특수 문자의 미 \a 경고음 소리 발생 \b 백스페이스 (backspace)
1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
Part 11 문자열 ©우균, 창병모 ©우균, 창병모.
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
제 9 장 구조체와 공용체.
컴퓨터 프로그래밍 기초 [Final] 기말고사
-Part2- 제3장 포인터란 무엇인가.
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
자료 구조: Chapter 3 (2)구조체, 포인터
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
제15장 파일 입출력 문자열을 출력하는 여러가지 방법 (15-2쪽) 문자열만 처리하는 입출력 함수
Chapter 13 문자 데이터와 문자열 문자 데이터 문자열.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
제 3장. C보다 나은 C++ II.
C 프로그래밍.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
6장. printf와 scanf 함수에 대한 고찰
프로그래밍 랩 – 7주 리스트.
14장. 포인터와 함수에 대한 이해.
11장. 1차원 배열.
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 8 장 배열, 주소, 포인터.
C#.
JA A V W. 03.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
어서와 C언어는 처음이지 제14장.
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
컴퓨터 개론 및 실습 11. 동적 메모리 할당.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
24장. 파일 입출력.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
19. 함수 포인터와 void 포인터.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
포인터 1차원 배열과 포인터 2차원 배열과 포인터 문자열 배열과 포인터 포인터 배열
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 7 장 배열.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
8주차: Strings, Arrays and Pointers
5강. 배열 배열이란? 배열의 문법 변수와 같이 이해하는 배열의 메모리 구조의 이해 레퍼런스의 이해 다차원 배열
문자열 컴퓨터시뮬레이션학과 2015년 봄학기 담당교수 : 이형원 E304호,
Choi Seong Yun 컴퓨터 프로그래밍 기초 #03 : 변수와 자료형 Choi Seong Yun
Fucntion 요약.
제 15 강 문자와 코드 shcho.pe.kr.
에어 PHP 입문.
11장 배열 1. 배열이란? 1.1 배열의 개요 1.2 배열의 선언과 사용.
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
구조체(struct)와 공용체(union)
Summary of Pointers and Arrays
Numerical Analysis Programming using NRs
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
제 4 장 Record.
제 29 강 스트링(string) 다루기 s a i s . s T i h t g r i n.
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
김선균 컴퓨터 프로그래밍 기초 - 12th : 문자열 - 김선균
어서와 C언어는 처음이지 제21장.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
13. 포인터와 배열! 함께 이해하기.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 9 장 문자열

9.1 문자열의 기초 문자열 (string) T h i s i s a s t r i n g \0 9.1 문자열의 기초 문자열 (string) 이중 인용부호로 묶여진 문자들의 나열 예) “This is a string” “Hello World” “xyz 123*#@&” 문자열의 끝을 표시하는 널 문자(\0)가 맨 끝에 첨가된 문자들의 배열 인용 부호는 저장되지 않음 예) “This is a string”의 메모리 저장 형태 T h i s i s a s t r i n g \0

9.1 문자열의 기초 Input Output Program 9-1: 실행 결과 : Enter a string: 9.1 문자열의 기초 문자열의 입력과 출력 문자열의 입/출력을 위하여 미리 정의된 함수들 (라이브러리) 사용 위의 함수를 이용하기 위하여 헤더 화일에 <stdio.h>를 포함시켜야 함 Input Output gets() puts() scanf() printf() getchar() putchar() #include <stdio.h> void main(void) { char message[81]; printf(“Enter a string : \n”); gets(message); printf(“The string just entered is : \n”); put(message); } 실행 결과 : Enter a string: This is a test input of a string of characters. The string just entered is : Program 9-1:

9.1 문자열의 기초 characters\n gets() characters\0 9.1 문자열의 기초 gets()와 puts()의 성질 입출력 함수들의 비교 puts(message) 는 printf(“%s\n”, message)와 동일함 gets(message)는 scanf(“%s”, message)와 차이가 있음 scanf() 함수는 공백이나 개행 문자가 입력될 때까지만 입력함 gets() 함수는 개행 문자가 입력될 때까지 입력함 예) “this is a string”을 입력하는 경우 scanf ( “%s %s %s %s” message1, message2, message3, message4); characters\n gets() characters\0 characters\0 puts() characters\n

9.1 문자열의 기초 배열 처리방식을 이용한 문자열의 처리 예) 문자열 string2의 내용을 string1으로 복사하는 함수 void strcopy (char string1[], char string2[] ) { /* 두 개의 배열이 전달됨 */ int i = 0; /* i는 첨자로 사용됨 */ while (string2[i] != ‘\0’) { /* 문자열의 끝을 검사함 */ string[i] = string2[i]; /* string1으로 내용을 복사함 */ ++i; } string1[i] =‘\0’; /* string1에 문자열 끝 표시를 함 */ return; #include <stdio.h> void main(void) { char message[81]; char new_mess[81]; int i; void strcopy (char [], char [] ) printf(“Enter a sentence:”); get(message); strcopy(new_mess, message); put(new_mess); } 결과 : Enter a sentence: How much wood could a woodchuck chuck. How much wood would a woodchuck chuck.

9.1 문자열의 기초 문자단위의 입출력 Enter a string: 9.1 문자열의 기초 문자단위의 입출력 #include <stdio.h> void main(void) { char message[81]; int i; void getline(char []); printf(“Enter a string: \n”); getline(message); printf(“The string just entered is : \n”); put(message); } void getline ( char string[ ] ) { int i = 0 ; char c; while ( i < 80 && (c = getchar( ) ) !=‘\n’ ) { string [i] = c; i++ } string [i] = ‘\0’; return; Enter a string: This is a test input of a string of characters. The string just entered is :

9.2 포인터와 라이브러리 함수 문자열에서 첨자와 포인터 사용 9.2 포인터와 라이브러리 함수 문자열에서 첨자와 포인터 사용 문자열을 다룰 때 첨자 표기법 대신에 포인터를 사용하면 프로그램이 더욱 간결해지고 효율적으로 작성됨 예) 포인터를 사용하여 strcopy() 함수의 재작성 void strcopy (char string1[], char string2[] ) /* 버전 1 */ { int i = 0; while ( string2[i] ) { string1[i] = string2[i] ; ++i; } string1[i] = ‘\0’; return; void strcopy (char string1[], char string2[] ) /* 버전 2*/ { int i = 0; while ( string1[i] = string2[i] ) ++i; return; }

9.2 포인터와 라이브러리 함수 포인터를 사용하여 재작성 9.2 포인터와 라이브러리 함수 포인터를 사용하여 재작성 void strcopy ( char *string1, char *string2 ) /* 버전 3 */ { while ( *string1 = *string2 ) { string1++; string2++; } return; void strcopy ( char string1, char string2 ) /* 버전 4 */ while ( *string1 ++ = *string2 ++) ; 지시된 문자는 포인터가 증가되기 전에 접근되고, 지정문 *string1 = *string2 이 실행된 후에 포인터들이 증가되어 다음 문자를 올바르게 지시한다.

9.2 포인터와 라이브러리 함수 테이블 9-2 : 배열과 문자 라이브러리 함수와 루틴 Name Description 9.2 포인터와 라이브러리 함수 테이블 9-2 : 배열과 문자 라이브러리 함수와 루틴 Name Description strcat(string1, string2) string2의 내용을 string1에 붙인다 strchr(string,character) string 내에서 character가 처음 발생한 곳을 찾아서 그 위치 (주소)를 리턴한다. strcmp(string1, string2) string1과 string2를 비교한다. strcpy(string1, string2) string2를 string1에 복사한다. strlen(string) string의 길이를 리턴한다 isalpha(character) character가 알파벳이면 0이 아닌 수를 반환하고, 알파벳이 아니면 0을 반환한다 isupper(character) character가 대문자이면 0이 아닌 수를 반환하고, 대문자가 아니면 0을 반환한다 islower(character) character가 소문자이면 0이 아닌 수를 반환하고, 소문자가 아니면 0을 반환한다 isdigit(character) character가 숫자(0에서 9까지)이면 0이 아닌 수를 숫자가 아니면 0을 반환한다 toupper(character) character가 소문자이면 대문자로 변환시키고, 그렇지 않으면 그 값을 그대로 반환한다 tolower(character) character가 대문자이면 소문자로 변환시키고,

9.3 문자열 정의와 포인터 배열 Theis is a string \0 Theis is a string \0 문자열 정의와 포인터 상수의 자동 생성 문자열을 정의하면 원소 수 만큼의 기억장소와 함께 시작 주소를 저장하는 하나의 포인터 상수 (문자열 배열의 이름과 동일함)를 생성함 예) static char message1[81]을 정의하면 - 81 개의 문자열을 저장하는 공간 확보 - message1[0]의 주소 값을 가지는 포인터 상수 message1을 생성 - 포인터 상수 message1은 변할 수 없음 포인터를 이용한 문자열의 생성 예) char message1[81] = “This is a string”; char *message2 = “This is a string”; Theis is a string \0 message1==&message1[0]: 상수 Theis is a string \0 message2 : 변수

9.3 문자열 정의와 포인터 배열 포인터를 사용한 문자열 생성의 예제 #include <stdio.h> void main(void) { char message2 = “this is a string”; printf(“\n The string is : %s”, message2); printf(“\n The first address of this string is %p”, message2); message2 = “A new message”; printf(“\n The string is now : %s”, message2); } 결과 : The string is: this is a string The first address of this string is 009E The string is now: A new message The first address of this string is 00EB 주의 : message2에 지정된 두 번째 문자열이 첫번째 문자열을 덮어 쓰지 않는다. 즉, 새로운 문자열을 가리키기 위해 message2 안에 있는 주소 만을 바꾼다. (그림 9-6 참고)

9.3 문자열 정의와 포인터 배열 포인터 배열 seasons[0] seasons[1] seasons[2] seasons[3] 문자(열)에 대한 포인터를 원소로 하는 배열 예) char *seasons[4]; seasons[0] = “Winter”; seasons[1] = “Spring”; seasons[2] = “Summer”; seasons[3] = “Fall”; [프로그램 9-6] : #include<stdio.h> void main(void) { int n; char *seasons[] = “”Winter”, “Spring”, “Summer”, “Fall”} ; for (n=0; n<4; ++n) printf(“The season is %s.”, seasons[n]); } result: The season is Winter. The season is Spring. The season is Summer. The season is Fall. Winter\0 Spring\0 Summer\0 Fall\0 seasons[0] seasons[1] seasons[2] seasons[3] < 메모리 구조 >

9.3 문자열 정의와 포인터 배열 포인터 배열의 잇점 [프로그램 9-7]: 문자열들을 하나의 그룹으로 묶어서 관리할 수 있으며, 사용자는 첨자의 조정만으로 문자열들을 간편하게 관리할 수 있음 예) [프로그램 9-7]: #include<stdio.h> void main(void) { int n; char *seasons[] = “”Winter”, “Spring”, “Summer”, “Fall”} ; printf(“Enter a month (use 1 for Jan., 2 for Feb., etc.):”); scanf(“%d”, &n); n = (n%12) / 3; printf(“The month entered is a %s month.”, seasons[n]); } 결과 : Enter a month (use 1 for Jan., 2 for Feb., etc.) : 12 The month entered is a Winter month.

9.4 형식 문자열 필드의 폭 지정자 (field width specifier) 예) “Have a Happy Day”를 폭 25의 필드에 출력 printf(“|%25s|”, “Have a Happy Day”); => | Have a Happy Day| printf(“|%25s|”, “Have a Happy Day”); => |Have a Happy Day | printf(“|%25.12s|”, “Have a Happy Day”); /* 폭 25, 처음 12개 문자 를 오른쪽으로 붙여서 출력*/ => | Have a Happy| printf(“|%  25.12s|”, “Have a Happy Day”); => |Have a Happy |

9.4 형식 문자열 메모리 안에서의 문자열 변환 표준 입출력 장치 대신에 메모리의 변수에 값을 입력하거나 메모리 변수의 값을 출력함 예) spintf(), sscanf() sprintf(dis_strn, “%d %d”, num1, num2); sscanf(data, “%c%lf %d”, &dol, &price, &units); $23.45 10 이라는 값이 data라는 이름의 문자 배열안에 있었다면, dol에는 $ price에는 23.45 unit에는 10이 저장됨

9.4 형식 문자열 형식 문자열 (format string) printf(), scanf(), sprintf(), sscanf() 함수에는 형식(제어) 문자열이 사용되어 문자열의 형식을 제어함 예) printf(“$%5.2f %d”, num1, num2);를 부르는 함수 안에 포함되는 제어 문자열 “$%5.2f %d”는 그 자체로 문자열로서 저장될 수 있고, 문자열의 주소는 printf()에 대한 호출(call)에서 사용될 수 있다. 만약 fmat에 대한 다음과 같은 선언들 중의 하나가 생성된다면: char *fmat = “%5.2f %d”; 혹은 char fmat[] = “$%5.2f %d”; printf(fmat, num1, num2);는 printf(“$%5.2f %d”, num1, num2);와 동일하게 처리된다. <= 형식 문자열을 한번 정의한 후 여러곳에서 사용하는 경우 형식 문자열의 정의만 바꾸면 그것을 사용하는 모든 printf(), scanf(), sprintf(), sscanf()의 형식 문자열이 자동으로 변경된다 (수정 용이)

9.5 자주 발생하는 에러들 존재치 않는 요소를 지시하기 위해 포인터를 사용하는 경우 널문자 고려 용어의 오해 C 컴파일러는 배열의 첨자와 마찬가지로 포인터의 범위 체크를 수행하지 않기 때문에 포인터 주소의 유효함은 사용자가 보장해야 함 널문자 고려 문자열의 끝 원소인 널문자를 고려하지 않은 문자열 크기를 지정하는 경우 용어의 오해 만약 text가 다음과 같이 정의된 경우에 변수 text를 문자열이라고 부름 char *text; 때문에 “Hooray for the Hoosiers”라는 문자들을 text 문자열에 저장하라고 명령할 수 있음 엄격히 말하면, 문자열 text나 문자열 변수 text라고 부르는 것은 틀린 것이다. 실제로 변수 text는 문자열에 있는 첫번째 문자의 주소를 포함하는 포인터이기 때문이다.

9.6 요 약 1. 하나의 문자열은 널(null)문자에 의해서 끝나는 문자들의 배열이다. 2. 문자열들은 표준 배열 처리(array-processing) 기법을 사용해서 처리될 수 있다. 3. 문자열 입력에 gets(), scanf(), getchar() 등의 라이브러리 함수들을 사용한다. scanf() 함수는 공백이 입력될 때 입력을 끝내므로 주의하여 사용해야 한다. 4. 문자열을 출력하기 위해 puts(), printf(), putchar() 등의 함수는 사용한다. 5. 배열의 첨자 대신 포인터 표기법과 포인터 연산을 사용하여 복수개의 문자열을 편리하게 다룰 수 있다. 6. 문자열을 편리하게 다루기 위하여 표준 라이브러리 함수들이 제공된다. 내부적으로 이러한 함수들은 포인터를 사용해서 문자 단위(character-by-character manner)로 변환되어 처리된다. 7. 문자열에 대한 기억장소는 문자열 배열이나 문자에 대한 포인터를 선언해서 생성할 수 있다. 문자에 대한 포인터에는 문자열을 할당(assign)할 수 있다. 문자열의 배열에 대한 문자열 할당은 선언문 안에 있을 때를 제외하고 사용할 수 없다. 8. 배열은 다음과 같은 형식의 문자열 할당을 사용해서 초기화 될 수 있다. char *arr_name[] = “text”; char *arr_name[] = {‘t’, ‘e’, ‘x’, ‘t’, ‘\0’};