50
1 제 10 제 제제 제제제 제제

제 10 장 문자 입출력 함수

  • Upload
    elliot

  • View
    110

  • Download
    13

Embed Size (px)

DESCRIPTION

제 10 장 문자 입출력 함수. 목차. 문자 입출력 함수 개요 단일 문자 입출력 함수 문자열 입출력 함수 연습문제. 문자 입출력 함수. 처음에는 함수의 부재로 고생하게 되지만 나중에는 그 함수들을 만들게 됨 문자 입출력 함수는 크게 단일문자 입출력함수와 문자열 입출력함수로 나뉨. 문자 입출력 함수의 종류. 문자 입출력 함수의 종류. 출력한다 . put, print 라는 단어가 들어감 예 ) print f(), put s(), put c(), f print f() 입력한다 . - PowerPoint PPT Presentation

Citation preview

Page 1: 제  10  장 문자 입출력 함수

1

제 10 장 문자 입출력 함수

Page 2: 제  10  장 문자 입출력 함수

목 차• 문자 입출력 함수 개요• 단일 문자 입출력 함수• 문자열 입출력 함수• 연습문제

Page 3: 제  10  장 문자 입출력 함수

3

문자 입출력 함수• 처음에는 함수의 부재로 고생하게 되지만 나중에는 그 함수들을 만들게 됨• 문자 입출력 함수는 크게 단일문자 입출력함수와 문자열 입출력함수로 나뉨

Page 4: 제  10  장 문자 입출력 함수

4

문자 입출력 함수의 종류대분류 소분류 출력 분류 해당 함수

출력 함수문자 출력함수 화면 출력 putchar(), printf()

파일 출력 putc(), fputc(), fprintf()

문자열 출력함수 화면 출력 puts(), printf(), fputs()

파일 출력 fputs(), fprintf()

입력 함수문자 입력함수

화면 (키보드 ) 입력 getchar(), scanf(), fgetc()

파일 입력 getc(), fgetc(), fscanf()

문자열 입력함수화면 (키보드 ) 입력 gets(), scanf(), fgets()

파일 입력 fgets(), fscanf()

Page 5: 제  10  장 문자 입출력 함수

5

문자 입출력 함수의 종류• 출력한다 .

– put, print 라는 단어가 들어감– 예 ) printf(), puts(), putc(), fprintf()

• 입력한다 .– get, scan 이라는 단어가 들어감– 예 ) getc(), getchar(), scanf(), fscanf()

• 파일에서 입출력을 처리한다 .– 가장 앞 머리에 ‘ f’ 가 들어감– 여기서의 파일이란 개념은 우리가 일반적으로 알고 있는 파일이 아닌 유닉스의 파일 개념을

따름– 일반적인 의미에서의 파일이란 하드 디스크에 저장되어 있는 파일을 뜻하지만 유닉스에서의

파일이란 플로피 디스크나 마그네틱 디스크 , CD ROM 등이 모두 될 수 있음– 결국 파일에 무언가 쓴다는 것은 하드 디스크 뿐만 아니라 CD ROM 에 기록하는 것도 포함됨– C 가 유닉스라는 운영체제를 만들기 위해서 탄생한 만큼 꼭 알아두어야 하는 개념임– 예 ) fputc(), fputs(), fgets(), fprintf(), fscanf()

Page 6: 제  10  장 문자 입출력 함수

6

문자 입출력 함수의 종류• 하나의 문자를 입출력

– 가장 끝머리에 c 나 char 이 들어감– 예 ) getc(), getchar(), putc(), putchar()

• 문자열을 처리– 가장 끝머리에 s 가 들어감– 예 ) gets(), puts()

Page 7: 제  10  장 문자 입출력 함수

7

문자 입출력 함수의 종류• 사용자로부터 이름을 입력 받고 싶다 .

– fgets() 를 사용– gets() 나 scanf() 를 사용할 수도 있지만 fgets() 를 사용하는 것이

좋음– gets() 는 문자열을 다룰 때 절대 사용하지 말아야 할 함수이며 sc

anf() 는 공백이 포함된 문자열을 다룰 때 문제가 발생함

• 사용자로부터 하나의 문자를 입력 받고 싶다 .– ( 사용자에게 어떤 문제를 제시하고 ‘ y’ 나 ‘ n’ 과 같은 간단한

문자를 입력 받아 처리하고 싶을 때가 이에 해당 )– getchar() 을 사용– getc() 나 fgetc() 는 일단 파일에서 입력 받는다고 생각하고 제외

(STDIO 를 사용하면 사용자로부터 받을 수 있음 )– scanf() 는 너무 무거운 함수이기 때문에 사용을 자제해야 함

Page 8: 제  10  장 문자 입출력 함수

8

문자 입출력 함수의 종류• 파일에서 문자열을 입력 받는다 .

– 파일에서 문자열을 입력 받을 때는 두 부류로 나눌 수 있는데 파일의 내용이 어떤 규칙성을 가지며 행 단위로 배열되어 있다면 fscanf() 를 사용하는 것이 편리하고 특별한 규칙성이 없이 읽어 들이는 것에만 초점이 맞추어져 있다면 fgets() 를 사용하는 것이 편리

– 일반적으로는 파일에서 읽어 들일 때에는 fscanf() 나 fgets() 보다는 fgetc() 나 getc() 를 많이 사용

– 왜냐하면 파일을 C 로 처리할 때는 비트나 바이트 단위로 처리할 때가 많으며 문자열 단위로 읽어 들이는 경우가 많지 않기 때문임

• 화면에 하나의 문자를 출력하고 싶다 .– printf() 나 putchar() 를 사용– 일반적으로 하나의 문자라도 printf() 를 사용하는 경우가 많은데 하나의

문자를 출력할 때는 꼭 putchar() 를 사용하는 것이 좋음 . (putchar() 이 printf() 보다 훨씬 가벼운 함수이며 빠르기 때문 )

Page 9: 제  10  장 문자 입출력 함수

9

문자 입출력 함수의 종류• 화면에 문자열을 출력하고 싶다 .

– 이때는 두 가지로 분류해 볼 수 있다 . 화면에 단순히 출력하는 경우와 특정한 형식에 맞추어서 출력하는 경우이다 . 단순히 문자열만 출력하려면 puts() 를 사용하는 것이 좋은데 특히 puts()는 자동 개행문자를 포함하기 때문에 좀더 심플하게 출력이 가능함

– 하지만 특정한 형식에 맞추어서 문자열을 출력하려면 puts() 는 그 기능을 하지 못하므로 printf() 를 사용 ( 간단한 문자열은 puts()를 사용하는 것이 좋음 . printf() 보다 훨씬 가벼움 )

• 파일에 문자열을 출력하고 싶다 . ( 저장하고 싶다 .)– 파일에 출력하고 싶은 내용이 특정한 형식을 취하고 있는지

아닌지에 따라서 다른 함수가 사용되는데 특정한 형식을 취해야 한다면 fprintf() 가 적당하며 단순히 문자열을 파일에 기록하는 것이라면 fputc() 나 putc() 를 사용

Page 10: 제  10  장 문자 입출력 함수

10

버퍼의 개념• 예제 ( 버퍼로 인한 문제점 )

#include <stdio.h>

main(){

char answer;

while(1){printf(“당신은 남자 입니까 ? (y/n) “);answer = getchar();

if(answer == ‘y’) puts(“당신은 남자 입니다.”);else puts(“당신은 여자 입니다.”);}

}

getchar()는 버퍼형 입출력 함 수 이 다 . 버 퍼 형 입 출 력 함 수 는 개 행 문 자 에 의 해 서 반 응 하 기 때 문 에 항 상 엔터키를 입력해야 결과를 볼 수 있다.

당신은 남자 입니까 ? (y/n) y당신은 남자 입니다.당신은 여자 입니다.당신은 남자 입니까 ? (y/n) _

Page 11: 제  10  장 문자 입출력 함수

11

버퍼의 개념• 버퍼란 ?

– 버퍼 (buffer) 는 ‘완충 물 , 쿠션’이라는 개념을 가지고 있음– 완충이라는 것은 부족한 것에 대한 보완 , 보충의 의미가 있는데 컴퓨터에서는 이 완충이 바로 메모리와 하드 디스크 간의 속도 차를 완화해 주고 있음– 컴퓨터에서의 버퍼는 임시 저장 장소를 뜻함– 임시 저장 장소에 저장되는 내용은 문자나 문자열 , 숫자 등 어느 것이나 올 수 있는데 입출력의 효율을 위해서 사용함

Page 12: 제  10  장 문자 입출력 함수

12

putchar()

• 예제 ( 단일 문자 출력 )#include <stdio.h>

main(){

int i;

for(i = 20;i <= 125;i++)putchar(i);

}123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}

#include <stdio.h>

main(){

int i;

for(i = 0;i < 26;i++)putchar(‘a’ + i);

}

‘a’ + i는 97 + 0, 97 + 1 … 과 같이 동작한다. 그러므로 97, 98, 99 … 에 대한 아스키 문자가 출력된다.

abcdefghijklmnopqrstuvwxyz

Page 13: 제  10  장 문자 입출력 함수

13

getchar()

• 예제 ( 단일 문자 입력 : 다음의 프로그램에서 문제점은 ?)#include <stdio.h>

main(){

char c;

while(1){printf(“당신의 성별은 ? (남자 = 1, 여자 = 2) “);

c = getchar();if(c == ‘1’) puts(“당신은 남자 입니다.”);else puts(“당신은 여자 입니다.”);}

}

당신의 성별은 ? (1, 2) 1당신은 남자 입니다.당신의 성별은 ? (1, 2)당신은 여자 입니다.당신의 성별은 ? (1, 2) _

Page 14: 제  10  장 문자 입출력 함수

14

getchar()

• getchar() 의 입력형태

11 enter

1 \n

49

10

Page 15: 제  10  장 문자 입출력 함수

15

getchar()

• 버퍼 경유 입출력 함수 특성처리#include <stdio.h>

main(){

char c = 0;

while(c != EOF){printf(“당신의 성별은 ? (남자 = 1, 여자 = 2) “);

c = getchar(); fflush(stdin);if(c == ‘1’) puts(“당신은 남자 입니다.”);else puts(“당신은 여자 입니다.”);}

}

첫 글 자 이 외 의 나머지 쓰레기 문자 값 을 모 두 날 려 버린다.

Page 16: 제  10  장 문자 입출력 함수

16

puts()• int puts(const char *s);

– 인자 : 문자열 포인터– 리턴값 : 출력되는 문자의 길이 ( 일반적으로 무시 )

• 간이 예제– puts(“jung jae une”);

– char *imsi = “archie”;– puts(imsi);

– puts(“line one”);– puts(“line two”);

Page 17: 제  10  장 문자 입출력 함수

17

puts()• 포인터와 문자열

#include <stdio.h>

main(){

int i;char *s = “abcdefghijklmnopqrstuvwxyz”;

for(i = 0;i < 26;i++)puts(s + i);

}

처 음 s 는 ‘a ’를 가 리 키 고 한 번 회전할 때마다 다음 문자를 가리키게 된다.

abcdefghijklmnopqrstuvwxyzbcdefghijklmnopqrstuvwxyzcdefghijklmnopqrstuvwxyzdefghijklmnopqrstuvwxyzefghijklmnopqrstuvwxyzfghijklmnopqrstuvwxyzghijklmnopqrstuvwxyzhijklmnopqrstuvwxyzijklmnopqrstuvwxyzjklmnopqrstuvwxyzklmnopqrstuvwxyzlmnopqrstuvwxyzmnopqrstuvwxyznopqrstuvwxyzopqrstuvwxyzpqrstuvwxyzqrstuvwxyzrstuvwxyzstuvwxyztuvwxyzuvwxyzvwxyzwxyzxyzyzz

Page 18: 제  10  장 문자 입출력 함수

18

gets(), fgets()• char *fgets(char *s, int size, FILE *stream);

– stream 으로부터 size 크기만큼 얻어 s 에 저장

#include <stdio.h>

main(){

char dim[20];

printf(“What’s your name ? “);fgets(dim, 20, stdin);

printf(“Your name is %s.\n”, dim);}

What’ s your name ? archieYour name is archie.

• 다음처럼 포인터를 사용할 수 도 있음 char *imsip;imsip = (char *)malloc(20);

Page 19: 제  10  장 문자 입출력 함수

19

제 11 장 문자열 함수

Page 20: 제  10  장 문자 입출력 함수

20

목 차• 문자열 함수• 문자열 복사함수• 문자열 연결함수• 문자열 비교함수• 문자열 탐색함수• 문자열 변경함수• 문자 검사함수• 연습문제

Page 21: 제  10  장 문자 입출력 함수

21

문자열 함수 개론• C 의 문자열 함수는 다른 언어에 비해 부족함• 함수의 이름이 함축적 임• 사용법이 간단함

Page 22: 제  10  장 문자 입출력 함수

22

문자열 함수 종류• strcasecmp, strncasecmp, strcat, strncat, strlcat, strchr, strrchr, strcm

p, strncmp, strcpy, strncpy, strlcpy, strcspn, strspn, strdup, strlen, strpbrk, strstr, strtok, strtok_r

복사 strcpy*, strncpy, strlncpy

연결 strcat*, strncat

비교 strcmp*, strncmp, strcasecmp, strncasecmp

탐색 strchr, strrchr, strstr

추출 strlen*, strpbrk, strtok, strtok_r, strspn, strcspn

Page 23: 제  10  장 문자 입출력 함수

23

문자열 함수 분류어근 행동참조 접미사 내 용

str n, r, case cpy (copy) 문자열을복사한다 .

cat (concatenate) 문자열을결합한다 .

cmp (compare) 문자열을비교한다 .

len (length) 문자열의길이를구한다 .

pbrk (break character) 지정한 문자열중의 문자가 나타나는 지점의 위치를리턴한다 .

chr (character) 문자하나를비교하고위치를리턴한다 .

str (string) 문자열을비교하고위치를리턴한다 .

tok (token) 문자열을추출한다 .

Page 24: 제  10  장 문자 입출력 함수

24

문자열 함수 분류

• str : string 문자열 함수를 총칭• r : scan reversely 역순• n : number of character 문자의 개수를 참조• case : case insensitivity 대소문자를 구별하지 않음

Page 25: 제  10  장 문자 입출력 함수

25

문자열 복사함수

• char *strcpy(char *s1, const char *s2)

– s2 를 s1에 복사– s2 가 가리키는 문자열을 s1이 가리키는 영역에 복사

함수원형 헤더파일char *strcpy(char *s1, const char *s2);char *strncpy(char *s1, const char *s2, size_t n);

string.h

리턴값 : s1 의주소값을그대로리턴

• char *strncpy(char *s1, const char *s2, size_t n)

– s2 를 s1에 n 문자길이만큼 복사– s2 가 가리키는 문자열을 s1이 가리키는 영역에 n 글자만큼 복사

Page 26: 제  10  장 문자 입출력 함수

26

문자열 복사함수• 예제 (strcpy())

#include <string.h>

main(){

char source[10];char *dest = “Good Man”;

strcpy(source, “archie”);puts(source);

strcpy(source, dest);puts(source);

strcpy(source, dest + 5);puts(source);

}

문자열 직접 복사

포 인 터 변수 를 이 용 한 문자열 복사

포인터 연산을 통한 부분 문자열 복사

archieGood ManMan

Page 27: 제  10  장 문자 입출력 함수

27

strncpy()• 예제 (strncpy())

#include <string.h>

main(){

char source[20] = {“This is a pen.”};char *dest = “This is a ink.”;

strncpy(source + 10, dest + 10, 3);puts(source);

strncpy(source, dest, strlen(dest));puts(source);

strncpy(source, dest + 10, 3);puts(source);

strncpy(source, dest + 10, 3);source[3] = ‘\0’;puts(source);

}

This is a ink.

inks is a pen.

This is a ink.

ink

This is a ink.This is a ink.inks is a ink.ink

Page 28: 제  10  장 문자 입출력 함수

28

문자열 연결함수 함수원형 헤더파일

char *strcat(char *s1, const char *s2);char *strncat(char *s1, const char *s2, size_t n);int sprintf(char *str, const char *format, ...);

string.hstring.hstdio.h

리턴 값 : s1 의주소값을 그대로 리턴한다 .

Page 29: 제  10  장 문자 입출력 함수

29

strcat()

• char *strcat(char *s1, const char *s2)– s1의 끝에 s2 의 문자열을 추가– s1이 가리키는 문자열의 끝에 널 문자를 제거하고 s1이 가리키는

문자열을 추가

#include <string.h>

main(){

char source[20] = {“I love “};char *dest = “you!”;

strcat(source, dest);puts(source);

strcat(source, dest + 3);puts(source);

}

dest가 가리키는 문자열을 source의 뒤에 추가한다. source는 dest를 추가할 만큼 충분히 큰 크기여야 한다.

I love you!I love you!!

Page 30: 제  10  장 문자 입출력 함수

30

strncat()

• char *strncat(char *s1, const char *s2, size_t n)

– s1에 s2 의 n 길이만큼 추가– s2 가 가리키는 주소 값부터 n 길이만큼의 문자를 s1이 가리키는 문자열의 끝에

추가

#include <string.h>

main(){

char source[50] = {“My phone number is ”};char *dest = “02-823-7656”;

strncat(source, dest, 11);puts(source);

strncat(source, dest + 2, 9);puts(source);

}

dest가 가리키는 문자열 중 에 서 1 1 문 자 만 source에 추가한다.

My phone number is 02-823-7656My phone number is 02-823-7656-823-7656

Page 31: 제  10  장 문자 입출력 함수

31

sprintf()

• int sprintf(char *str, const char *format, ...);

#include <stdio.h>

main(){

char join_string[20];char *string = “This is“;int number = 775;

sprintf(join_string, “[%s %d]”, string, number);puts(join_string);

}

변환 형식문자를 이용하여 문자열, 숫자등을 하나의 문자열로 구성할 수 있다.

[This is 775]

Page 32: 제  10  장 문자 입출력 함수

32

문자열 비교함수 함수원형 헤더파일

int strcasecmp(const char *s1, const char *s2);int strncasecmp(const char *s1, const char *s2, size_t n);int strcmp(const char *s1, const char *s2);int strncmp(const char *s1, const char *s2, size_t n);

string.h

리턴값 : s1 == s2 이면리턴값 0s1 > s2 이면양의정수리턴s1 < s2 이면음의정수리턴

Page 33: 제  10  장 문자 입출력 함수

33

문자열 비교함수• int strcasecmp(const char *s1, const char *s2)

– s1과 s2 의 문자열을 비교하여 일치하면 0 을 리턴– s1이 가리키는 문자열과 s2 가 가리키는 문자열을 비교하고

일치하면 0 을 리턴 하고 아니면 양수나 음수를 리턴– 리턴 값이 0 이면 두 문자열은 일치– 대소문자는 구별하지 않음

• int strncasecmp(const char *s1, const char *s2, size_t n)

– s1과 s2 의 문자열을 n 길이만큼만 비교하여 일치하면 0 을 리턴– s1이 가리키는 문자열과 s2 가 가리키는 문자열을 n 길이만큼만

비교하고 일치하면 0 을 리턴 하고 아니면 양수나 음수를 리턴– 0 이면 두 문자열은 일치– 대소문자는 구별하지 않는다 .

Page 34: 제  10  장 문자 입출력 함수

34

문자열 비교 함수• int strcmp(const char *s1, const char *s2)

– s1과 s2 를 비교하여 일치하면 0 을 리턴– s1이 가리키는 문자열과 s2 가 가리키는 문자열을 비교하고 일치하면 0 을 리턴

하고 아니면 양수나 음수를 리턴– 대소문자를 구별함

#include <string.h>

main(){

char *source = “Thank you”;char *object = “you”;

if(strcmp(source, object) == 0)puts(“1. equal”);

else puts(“1. different”);

if(!strcmp(source + 6, object))puts(“2. equal”);

else puts(“2. different”);}

strcmp()의 결과가 0이면 참이다. 즉 , source, object가 가리키는 문자열이 같다는 것이다.

포인터 연산을 이용하여 문자열 중에서 특정 문자열만 비교한다.

1. different2. equal

Page 35: 제  10  장 문자 입출력 함수

35

문자열 비교함수• int strncmp(const char *s1, const char *s2, size_t n)

– s2 의 문자 중에서 n 길이만큼 s1과 비교하여 같으면 0 을 리턴– s2 가 가리키는 문자열 중에서 n 길이만큼 s1이 가리키는

문자열과 비교하고 같으면 0 을 리턴– 대소문자를 구별함

Page 36: 제  10  장 문자 입출력 함수

36

문자열 비교함수• int strncmp(const char *s1, const char *s2, size_t n)

– s2 의 문자 중에서 n 길이만큼 s1과 비교하여 같으면 0 을 리턴– s2 가 가리키는 문자열 중에서 n 길이만큼 s1이 가리키는 문자열과

비교하고 같으면 0 을 리턴– 대소문자를 구별함

#include <string.h>

main(){

int i = 0;char *source[] = { “Jung Jae Une”, “Park Un Ju”, “Jung Seo Youn”, NULL };char one[3], two[3];

while(source[i]){if(!strncmp(source[i], “Jung”, 4))

puts(source[i]);i++;}

}

널 포인터를 만날 때까지만 회전한다.성 ( ) 이 ‘J u n g ’인 사람만 이 름 까 지 출 력 한 다 . strncmp()가 특정한 문자열 만 큼 만 비교할 수 있 기 때문에 가능하다.

Jung Jae UneJung Seo Youn

Page 37: 제  10  장 문자 입출력 함수

37

문자열 탐색함수 함수원형 헤더파일

char *strchr(const char *s, int c);char *strrchr(const char *s, int c);char *strstr(const char *s1, const char *s2);char *strpbrk(const char *s1, const char *s2);

string.h

리턴값 : 일치하는문자나문자열이처음발견되는위치를리턴( 주소값리턴 )

Page 38: 제  10  장 문자 입출력 함수

38

문자열 탐색함수• char *strchr(const char *s, int c)

– 문자열 s 에서 문자 c 가 발견되면 발견된 위치를 리턴– s 가 가리키는 문자열에서 문자 c 가 발견되면 발견된 위치를 주소 값으로 리턴– 만약 발견되지 않으면 널 포인터가 리턴 됨

#include <string.h>

main(){

char *source = “My birthday is @1968.12.21”;

printf(“%s\n”, strchr(source, ‘@‘) + 1);}

1968.12.21

Page 39: 제  10  장 문자 입출력 함수

39

문자열 탐색함수• char *strrchr(const char *s, int c)

– 문자열 s 에서 문자 c 가 발견된 위치를 리턴 ( 단 , 탐색은 앞이 아닌 뒤에서 함 )

– s 가 가리키는 문자열에서 뒤쪽부터 c 문자를 탐색 ( 만약 발견하지 못하면 널 포인터가 리턴 됨 )

#include <string.h>

main(){

char *source = “/usr/home/archie”;

printf(“%s\n”, strrchr(source, ‘/’ ) + 1);}

archie

Page 40: 제  10  장 문자 입출력 함수

40

문자열 탐색함수• char *strstr(const char *s1, const char *s2)

– 문자열 s1에서 문자열 s2 를 찾아 일치하면 위치를 리턴– s1이 가리키는 문자열에서 s2 가 가리키는 문자열을 탐색하고 일치하는

위치의 주소 값을 리턴 ( 만약 일치하는 문자열이 발견되지 않으면 널 포인터를 리턴함 )

#include <string.h>

main(){

char source[] = “I’m about 1 meter 90”;char *find_pointer;

puts(source);find_pointer = strstr(source, “90”);strcpy(find_pointer, “78”);puts(source);

}

s o u r c e 가 가 리 키 는 문자열 중에서 90을 78로 변경한다.

I’ m about 1 meter 90I’ m about 1 meter 78

Page 41: 제  10  장 문자 입출력 함수

41

문자열 탐색함수• char *strpbrk(const char *s1, const char *s2)

– 문자열 s1 중에서 문자열 s2 에 속해있는 어떠한 문자라도 발견되면 발견된 위치를 리턴

– s1이 가리키는 문자열 중에서 s2 가 가리키는 문자열에 속해있는 어떠한 문자라도 발견되면 그 위치의 주소 값을 리턴

#include <string.h>

main(){

char *source = “My phone number is 825-1933. Are you OK?”;

do if((source = strpbrk(source, “0123456789-“)) != NULL) putchar(*source);

while(source++);}

source가 가리키는 문자열 중에서 지정한 문자를 찾아 그 위치를 리턴한다. 지정한 문자가 하나가 아 니 라 여 러 개 라 는 것 이 s t r c h r ( ) 과 의 차이점이다.

825-1933

Page 42: 제  10  장 문자 입출력 함수

42

문자열 변경함수 함수원형 헤더파일

int atoi(const char *nptr);long atol(const char *nptr);double atof(const char *nptr);

stdlib.h

리턴 값 : 문자열을 int 형 정수 , long 형 정수 , float 형으로 리턴

Page 43: 제  10  장 문자 입출력 함수

43

atoi()

• 예제 (atoi())

#include <stdlib.h>

main(){

char *int_string = “75”;char *long_string = “70000009”;char *float_string = “7.5”;

printf(“%d %d %.1f\n”,atoi(int_string), atol(long_string), atof(float_string));

}

75 70000009 7.5

Page 44: 제  10  장 문자 입출력 함수

44

sprintf()• 예제 (sprintf())

#include <stdio.h>

main(){

char number[10];

sprintf(number, “%d”, 756);puts(number);

sprintf(number, “%ld”, 70000009);puts(number);

sprintf(number, “%.1f”, 7.9);puts(number);

}

756700000097.9

Page 45: 제  10  장 문자 입출력 함수

45

문자 검사함수 매크로함수 설 명

int isalnum(int c); c 가알파벳문자이거나숫자이면 TRUE 반환int isalpha(int c); c 가알파벳문자이면 TRUE 반환int isascii(int c); c 가표준아스키문자 (0~127) 이면 TRUE 반환int iscntrl(int c); c 가제어문자이면 TRUE 반환int isdigit(int c); c 가숫자문자이면 TRUE 반환

int isgraph(int c); c 가 isalnum() 이나 ispunct() 에속해있으면 TRUE 반환 ( 단 , 스페이스는 제외한다 .)

int islower(int c); c 가알파벳소문자이면 TRUE 반환int isupper(int c); c 가 알파멧대문자이면 TRUE 반환

int isprint(int c); c 가 출력가능한 문자이면 TRUE 반환 – iscntrl() 에속해있는 문자는 FALSE 가 됨 . ( 스페이스는 TRUE 이다 .)

int ispunct(int c): c 가구두점문자이면 TRUE 반환

int isspace(int c); c 가 white space 문자이면 TRUE 반환 (white space – 개행문자 , 탭 , 수직탭 , 라인피드 , 폼피드 등을 이야기 한다 .)

int isxdigit(int c); c 가 16 진숫자문자이면 TRUE 반환

Page 46: 제  10  장 문자 입출력 함수

46

문자 검사함수• 예제 ( 소문자를 대문자로 출력 )

#include <stdio.h>#include <ctype.h>

main(){

int i;char buff[20 + 1];

puts(“알파벳 소문자와 숫자를 입력하시오. ( < 20)”);fgets(buff, sizeof(buff), stdin);

for(i = 0;i < strlen(buff);i++)if(islower(buff[i])) putchar(buff[i] – ‘ ’);else putchar(buff[i]);

}

알파벳 소문자와 숫자를 입력하시오. ( < 20)i love780 you.I LOVE 780 YOU.

Page 47: 제  10  장 문자 입출력 함수

47

1. 두 문자열을 비교하고 그 결과를 숫자가 아닌 다음과 같은 문자열로 출력하시오 .

• 일치할 때 : 두 문자열은 같습니다 .• 일치하지 않을 때 : 두 문자열은 일치하지 않습니다 .

2. 사용자로부터 두 개의 문자열을 입력 받고 두 문자열의 순서를 바꾸어서 다른 배열에 저장한 후 저장된 배열을 출력하시오 .

• 입력 : archie jung• 출력 : jung archie

Page 48: 제  10  장 문자 입출력 함수

48

1. 사용자로부터 문자열을 입력 받고 그 중에서 숫자가 아닌 것만 출력하시오 .

2. 사용자로부터 3 라인을 입력 받고 문자열의 길이와 라인 수 , 공백 수를 출력하시오 . ( 단 , isspace() 함수를 사용한다 .)

Page 49: 제  10  장 문자 입출력 함수

49

1. 사용자로부터 소수점이 있는 숫자를 입력 받고 다음과 같이 출력하도록 프로그램 하시오 . ( 단 , sprintf() 함수를 사용하시오 .)입력 : 34.25출력 : 34.25 (소수점 이하 2 자리 )

입력 : 17.9478출력 : 17.9478 (소수점 이하 4자리 )

Page 50: 제  10  장 문자 입출력 함수

50

2. 사칙 연산을 하는 프로그램을 작성하시오 .( 단 , 우선순위는 없으며 앞에서부터 처리 )입력 : 5 + 3 * 7출력 : 56 // 만약 우선순위를 처리한다면 105가 출력된다 .

// 할 수 있다면 우선순위의 개념을 넣어보자 .

// 이때는 스택의 개념이 필요하다 .

3. 10 개의 정수 값을 받아 들이고 이중에서 가장 큰 수와 가장 작은 수를 출력하시오 .