'함수'에 해당되는 글 4건

  1. 2008.12.23 [UNIX] 문자, 문자열 관련 함수
  2. 2008.12.23 [UNIX] getopt() 함수
  3. 2008.11.25 string.h 함수 정리 (형식/기능)
  4. 2008.10.31 파일 입출력

 문자 평가 함수 

① 문자 평가 함수들은 한 개 문자의 종류를 검사 또는 평가하는 함수로서 1개의 문자가 숫자인지, 문자인지, 제어문자인지, 대문자, 소문자인지의 여부를 평가한다. 

② 문자평가함수는 is-로 시작되며, is-로 시작되는 함수는 헤더파일인"ctype.h"에 정의되어 있다. 

(1)isalnum( ) 함수 

① 영문자(A∼Z, a∼z) 또는 숫자(0∼9)인지를 평가하여 참이면 0이외의 값을 돌려주고, 거짓이면 0을 돌려준다.

② 형식 

#include <ctype.h>

int isalnum(c);

int c;


【 예제13-1 】하나의 문자를 읽어 들여 영문자 또는 숫자이면 alphanumeric를 출력하는 프로그램(ch13-1.c)

▶ 프로그램

#include <stdio.h>

#include <ctype.h>

main()

{

int c;

clrscr(); 

printf("Input data : ");

c = getchar(); 

if(isalnum(c) != 0)

printf("\n %c = alphanumeric\n", c);

else

printf("\n %c = Not alphanumeric\n", c);

getch();

}

▶ 실행결과

Input data : a

a = alphanumeric

Input data : #

a = Not alphanumeric



(2)isalpha( ) 함수 

① 영문자(A∼Z, a∼z)인가를 평가하여 참이면 0이외의 값을 돌려주고, 거짓이면 0을 돌려준다.

② 형식

#include <ctype.h>

int isalpha(c);

int c;


【 예제13-2 】하나의 문자를 읽어 들여 영문자이면 alphabetic을 출력하는 프로그램(ch13-2.c)

▶ 프로그램

#include <stdio.h>

#include <ctype.h>

main()

{

int c;

clrscr(); 

printf("Input data : ");

c = getchar(); 

if(isalpha(c) != 0)

printf("\n %c = alphabetic\n", c);

else

printf("\n %c = Not alphabetic\n", c); 

getch();

}

▶ 실행결과

Input data : a

a = alphabetic

Input data : 3

a = Not alphabetic



(3) iscntrl( ) 함수 

① 제어문자인가를 평가하여 제어문자로 참이면 0이외의 값을 돌려주고, 거짓이면 0을

돌려준다.

② 형식

#include <ctype.h>

int iscntrl(c);

int c;


【 예제13-3 】하나의 문자를 읽어 들여 제어문자이면 Input data is control character를 출력하는 프로그램(ch13-3.c)

▶ 프로그램

#include <stdio.h>

#include <ctype.h>

main()

{

int c;

clrscr(); 

printf("Input data :");

c = getchar(); 

if(iscntrl(c) != 0)

printf("input data is conrol character\n");

else

printf("input data is not control character\n"); 

getch();

}

▶ 실행결과

Input data : a

Input data is not control character

Input data : ^A

Input data is control character



(4) isdigit( ) 함수 

① 0∼9인가를 평가하여 참이면 0이외의 값을 돌려주고, 거짓이면 0을 돌려준다.

② 형식

#include <ctype.h>

int isdigit(c);

int c;


【 예제13-4 】하나의 문자를 읽어들여 숫자이면 digit을 출력하는 프로그램(ch13-4.c)

▶ 프로그램

#include <stdio.h>

#include <ctype.h>

main()

{

int c;

clrscr();

printf("Input data :"); 

if(isdigit(c) != 0)

printf("\n %d = digit\n", c);

else

printf("\n %d = Not digit\n", c); 

getch();

}

▶ 실행결과

Input data : a

a = Not digit 

Input data : 9

a = digit



(5) isupper( ) 함수 

① 영문 대문자(A∼Z)인가를 평가하여 참이면 0이외의 값을 돌려주고, 거짓이면 0을 돌려준다.

② 형식

#include <ctype.h>

int isupper(c);

int c;

【 예제13-5 】하나의 문자를 읽어 들여 영문 대문자이면 upper alphabetic을 평가하는 프로그램(ch13-5.c)

▶ 프로그램

#include <stdio.h>

#include <ctype.h>

main()

{

int c;

clrscr();

printf("Input data :"); 

c = getchar(); 

if(isupper(c) != 0)

printf("\n %c = upper alphabetic\n", c);

else

printf("\n %c = Not upper alphanumeric\n", c); 

getch();

}

▶ 실행결과

Input data : a

a = Not upper alphabetic

Input data : A

a = upper alphabetic



(6) islower( ) 함수 

① 영문 소문자(a∼z)인가를 평가하여 참이면 0이외의 값을 돌려주고, 거짓이면 0을

돌려준다.

② 형식

#include <ctype.h>

int islower(c);

int c;

【 예제13-6 】다음과 같이 선언한 문자 중에서 소문자들을 출력하는 프로그램(ch13-6.c)

char a[9] = {'K', 'b', 's', 'M', 'b', 'c', 'S', 'b', 's'};

▶ 프로그램

#include <stdio.h>

#include <ctype.h>

main()

{

char c[9] = {'K', 'b', 's', 'M', 'b', 'c', 'S', 'b', 's'};

int i;

clrscr();

for(i=0; i<9; i++)

if(islower(c[i]) != 0)

printf("%c", c[i]);

getch();

}

▶ 실행결과

bsbcbs



(7) isspace( ) 함수 

① 공백인가를 평가하여 참이면 0이외의 값을 돌려주고, 거짓이면 0을 돌려준다.

② 형식

#include <ctype.h>

int isspace(c);

int c;


【 예제13-7 】공백이 입력되기 전까지 문자를 출력하는 프로그램(ch13-7.c)

▶ 프로그램

#include <stdio.h>

#include <ctype.h>

main()

{

char c;

clrscr();

printf("Input string : ");

c = getchar();

do

{

putchar(c);

c = getchar();

}

while(isspace(c) == 0);

getch();

}

▶ 실행결과

Input string : seoul korea

seoul




13-2. 문자 변환 함수 

① 소문자를 대문자로, 대문자를 소문자로 변환하거나 또는 ASCII 코드가 아닌 값을 ASCII 코드 값으로 바꾸어 준다.

② 문자변환함수는 헤더파일인 "ctype.h"에 정의되어 있다. 

(1) toascii( ) 함수 

① ASCII 코드로 변환시켜 주는 함수

② 형식

#include <ctype.h>

int toascii(c);

int c;


【 예제13-8 】지정 문자를 ASCII 코드로 변환시켜 주는 프로그램(ch13-8.c)

▶ 프로그램

#include <stdio.h>

#include <ctype.h>

main()

{

int c;

clrscr(); 

printf("Input character :");

c = getchar();

printf("ASCII CODE = %x\n", toascii(c));

printf("DECIMAL NUMBER = %d\n", c);

getch();

}

▶ 실행결과

Input character : A

ASCII CODE = 41

DECIMAL NUMBER = 65

(2) tolower( ) 함수 

① c가 대문자이면 소문자로 변환시켜 준다.

② 형식 

#include <ctype.h>

int tolower(c);

int c;



【 예제13-9 】지정문자가 대문자이면 소문자로 변환시켜 주는 프로그램(ch13-9.c)

▶ 프로그램

#include <stdio.h>

#include <ctype.h>

main()

{

int c;

clrscr(); 

printf("Input sring :"); 

while((c = getchar()) != EOF)

putchar(tolower(c)); 

getch();

}

▶ 실행결과

input string : MBC

mbc


(3) toupper( ) 함수 

① c가 소문자이면 대문자로 변환시켜 준다.

② 형식 

#include <ctype.h>

int toupper(c);

int c;



【 예제13-10 】지정문자가 소문자이면 대문자로 변환시켜 주는 프로그램(ch13-10.c)

▶ 프로그램

#include <stdio.h>

#include <ctype.h>

main()

{

int c;

clrscr(); 

printf("Input sring :"); 

while((c = getchar()) != EOF)

putchar(toupper(c)); 

getch();

}

▶ 실행결과

input string : mbc

MBC


13-3. 문자열의 조작함수 

문자열 조작 함수는 헤더파일인 "string.h"에 정의되어 있다. 

(1) strcpy( ) 함수 및 strncpy( ) 함수 

① 문자열을 복사하는 함수

② 형식

#include <string.h>

char *strcpy(cd, str);

char *strncpy(cd, str, len);

char *cd; ☞ 문자열이 복사되는 배열

char *str; ☞ 복사하는 문자열

int len; ☞ 복사하는 문자열의 길이

③ strcpy( )함수

"cd"가 가리키는 버퍼에 "str"이 가리키는 문자열을 복사하고, 함수값으로 "cd"의 값을 반환한다.

④ strncpy( ) 함수

앞에서부터 최대 len 문자까지를 복사한다. 이때 "cd"는 "복사 문자열의 길이 + 1"크기 이상을 확보해 두어야 한다. 

【 예제13-11 】문자열 str을 배열 cd에 copy하는 프로그램(ch13-11.c)

▶ 프로그램

#include <stdio.h>

#include <string.h>

main()

{

char cd[20] = " ";

char *str="Temple of the king";

clrscr();

printf("Before cd[20] data = %s\n", cd);

strcpy(cd, str);

printf("After cd[20] data = %s\n", cd);

getch();

}

▶ 실행결과

Before cd[20] data =

After cd[20] data = Temple of the king

【 예제13-12 】문자열 str에서 6개의 문자를 cd에 복사하는 프로그램(ch13-12.c)

▶ 프로그램

#include <stdio.h>

#include <string.h>

main()

{

char *cd;

char *str="Temple of the king";

int len = 6;

clrscr(); 

printf("Original *str data = %s\n", str);

printf("Before cd[20] data = %s\n", cd); 

strncpy(cd, str, len);

printf("After cd[20] data = %s\n", cd); 

getch();

}

▶ 실행결과

Original *str data = Temple of the king

Before cd[20] data =

After cd[20] data = Temple



(2) strcat( ) 및 strncat( ) 함수 

① 문자열을 연결시키는 함수

② 형식

#include <string.h>

char *strcat(buf, str);

char *strncat(buf, str, len);

char *cd;

char *str;

char *buf;

int len;

③ strcat( ) 함수

"buf"가 가리키는 버퍼에 들어있는 문자열의 뒷부분에 "str"이 가리키는 문자열을 연결시킨다.

④ strncat( ) 함수

"str"이 가리키는 문자열의 최대 "len" 문자까지만 "buf"가 가리키는 버퍼의 문자열에 연결시켜 준다.

【 예제13-13 】문자열 buf와 문자열 str을 연결하여 출력하는 프로그램이다.(ch13-13.c)

▶ 프로그램

#include <stdio.h>

#include <string.h>

main()

{

char *buf = "Temple";

char *str=" of the king";

clrscr(); 

printf("Original *buf data = %s\n", buf);

printf("Original *str data = %s\n", str); 

strcat(buf, str);

printf("After *buf data = %s\n", buf);

getch();

}

▶ 실행결과

Original *buf data = Temple

Original *str data = of the king

After *buf data = Temple of the king


【 예제13-14 】문자열 buf와 문자열 str의 11개의 문자를 연결하는 프로그램(ch13-14.c)

▶ 프로그램

#include <stdio.h>

#include <string.h>

main()

{

char *buf = "Temple";

char *str=" of the king";

char *p;

int len = 11;

clrscr(); 

printf("Original *buf data = %s\n", buf);

printf("Original *str data = %s\n", str); 

p = strncat(buf, str, len); 

printf("After *p data = %s\n", p);

getch();

}

▶ 실행결과

Original *buf data = Temple

Original *str data = of the king

After *p data = Temple of the kin

(3) strchr( ) 함수 및 strrchr( ) 함수 

① 지정된 문자의 최초 위치 탐색과 최후 위치 탐색을 위한 함수

② 형식

#include <string.h>

char *strchr(string, c);

char *strrchr(string, c);

char *string; ☞ 탐색되는 문자열

char *c; ☞ 찾고 싶은 문자열

③ strchr( ) 함수

"string"내에서 찾고 싶은 문자 c의 내용이 발견되면 발견된 최초의 위치를 반환하고 발견되지 않으면 null 값을 반환한다. 즉, 최초의 문자가 발견된 위치를 반환시켜 준다.

④ strrchr( ) 함수

"string"내에서 찾고 싶은 문자 c의 내용이 발견되면 발견된 최후 위치를 반환하고 발견되지 않으면 null값을 반환한다. 즉, 최후의 문자가 발견된 위치를 반환시켜 준다. 

【 예제13-15 】문자열 string에서 e가 발견된 최초의 주소를 구하는 프로그램(ch13-15.c)

▶ 프로그램

#include <stdio.h>

#include <string.h>

main()

{

char *string="Temple of the king";

char *c;

clrscr(); 

printf("*string data = %s\n", string);

printf("*string, address = %x\n", string); 

c = strchr(string, 'e');

printf("'e', address = %x\n", c);

printf("c = %s\n", c); 

getch();

}

▶ 실행결과

*string data = Temple of the king

*string, address = 194

'e', address = 195

【 예제13-16 】문자열 string에서 e가 기억된 마지막 주소를 구하는 프로그램(ch13-16.c)

▶ 프로그램

#include <stdio.h>

#include <string.h>

main()

{

char *string="Temple of the king";

char *c;

clrscr();

printf("*string data = %s\n", string);

printf("*string, address = %x\n", string); 

c = strrchr(string, 'e');

printf("last address,'e' = %x\n", c);

getch();

}

▶ 실행결과

*string data = Temple of the king

*string, address = 194

last address,'e' = 1a0



(4) strcmp( ) 함수 및 strncmp( ) 함수 

① 문자열을 비교하는 함수로 앞에서 한 개의 문자씩 사전식 순서로 비교하여 그 결과를

반환한다.

② 형식

#include <string.h>

int strcmp(string1, string2);

int strncmp(string1, string2, size);

char *string1, *string2; ☞ 비교할 문자열

unsigned size; ☞ 비교할 길이

③ 2개의 문자열을 비교한 후 다음과 같이 결과를 반환한다.

  • string1 > string2 이면 양수값을 반환한다.
  • string1 = string2 이면 0을 반환한다.
  • string1 < string2 이면 음수값을 반환한다.

④ strcmp(p, q) 함수

문자열 p와 q를 비교하여 p의 문자열이 알파벳순으로 q보다 앞이면 음수값, 뒤이면 양수값을 반환한다.

【 예제13-17 】문자열 string1과 문자열 string2를 비교하는 프로그램(ch13-17.c)

▶ 프로그램

#include <stdio.h>

#include <string.h>

main()

{

char *string1="America";

char *string2="Korea";

int i;

clrscr(); 

printf("*string1 data = %s\n", string1);

printf("*string2 data = %s\n", string2); 

i = strcmp(string1, string2);

printf("value i = %d\n", i); 

if(i != 0)

printf("string1 not equal to string2\n");

else

printf("string1 equal to string2\n"); 

getch();

}

▶ 실행결과

*string1 data = America

*string2 data = Korea

value i = -10

string1 not equal to string2


【 예제13-18 】문자열 string1과 문자열 string2를 비교하는 프로그램(ch13-18.c)

▶ 프로그램

#include <stdio.h>

#include <string.h>

main()

{

char *string1="Banana";

char *string2="Bingo";

int i;

unsigned len = 5;

clrscr(); 

printf("*string1 data = %s\n", string1);

printf("*string2 data = %s\n", string2); 

i = strncmp(string1, string2, len);

printf("value i = %d\n", i); 

if(i != 0)

printf("string1 not equal to string2\n");

else

printf("string1 equal to string2\n"); 

getch();

}

▶ 실행결과

*string1 data = Banana

*string2 data = Bingo

value i = -8

string1 not equal to string2

(5) strset( )함수 및 strnset( ) 함수 

① 문자열을 변경시키는 함수

② 형식

#include <string.h>

char *strset(string, c);

char *strnset(string, c, len);

char *string;

int c;

int len;

③ strset( ) 함수

문자열 string이 가리키는 곳의 모든 문자를 c와 같은 문자로 전부 변경시킨다.

④ strnset( ) 함수

문자열 string이 가리키는 곳의 첫 번째 문자부터 n개의 문자만 c와 같은 문자로 전부 변경시킨다. 

【 예제13-19 】포인터 string이 가리키는 "SONATA" 문자열을 "KKKKKK"로 바꾸는 프로그램(ch13-19.c)

▶ 프로그램

#include <stdio.h>

#include <string.h>

main()

{

char *string="SONATA";

clrscr(); 

printf("*string data = %s\n", string); 

strset(string, 'K');

printf("after string data = %s\n", string); 

getch();

}

▶ 실행결과

*string data = SONATA

after string data = KKKKKK

【 예제13-20 】포인터 string이 가리키는 "SONATA" 문자열을 "SONKKK"로 바꾸는 프로그램(ch13-20.c)

▶ 프로그램

#include <stdio.h>

#include <string.h>

main()

{

char *string="SONATA";

clrscr(); 

printf("*string data = %s\n", string); 

strset(string+3, 'K');

printf("after string data = %s\n", string); 

getch();

}

▶ 실행결과

*string data = SONATA

after string data = SONKKK


【 예제13-21 】포인터 string이 가리키는 "SONATA" 문자열을 "KKKATA"로 바꾸는 프로그램(ch13-21.c)

▶ 프로그램

#include <stdio.h>

#include <string.h>

main()

{

char *string="SONATA";

int len = 3;

clrscr(); 

printf("*string data = %s\n", string); 

strnset(string, 'K', len);

printf("after string data = %s\n", string); 

getch();

}

▶ 실행결과

*string data = SONATA

after string data = KKKATA

(6)strlen( ) 함수 

① 문자열의 길이를 알아내는 함수

② "\0"을 포함하지 않은 문자열 길이를 함수값으로 반환시켜 준다.

③ 형식

#include <string.h>

unsigned strlen(string);

char *string;


【 예제13-22 】문자열 string의 문자열 길이를 구하는 프로그램(ch13-22.c)

▶ 프로그램

#include <stdio.h>

#include <string.h>

main()

{

char *string="SONATA";

int len ;

clrscr(); 

printf("*string data = %s\n", string); 

len = strlen(string);

printf("string length = %d\n", len); 

getch();

}

▶ 실행결과

*string data = SONATA

string length = 6


(7) atoi( ) 함수 

① 문자열을 정수로 변환시키는 함수

② 형식

#include <stdlib.h>

int atoi(string);

char *string;


【 예제13-23 】문자열 string1과 문자열 string2를 정수로 변환하여 덧셈하는 프로그램(ch13-23.c)

▶ 프로그램

#include <stdio.h>

#include <stdlib.h>

main()

{

char *string1="1234";

char *string2="4321";

int i;

clrscr(); 

printf("*string1 data = %s\n", string1);

printf("*string2 data = %s\n", string2); 

i = atoi(string1) + atoi(string2);

printf("after integer data = %d\n", i); 

getch();

}

▶ 실행결과

*string1 data = 1234

*string2 data = 4321

after integer data = 5555

(8) strlwr( ) 함수, strupr( ) 함수, strrev( ) 함수 

① strlwr( ) 함수 : 소문자화 하는 함수 

【 예제13-24 】"KBS"를 "kbs"로 변환하는 프로그램(ch13-24.c)

▶ 프로그램

#include <stdio.h>

#include <stdlib.h> 

main()

{

char *string1="KBS";

char *string2;

clrscr(); 

printf("*string1 data = %s\n", string1);

string2 = strlwr(string1);

printf("*string2 data = %s\n", string2);

getch();

}

▶ 실행결과

*string1 data = KBS

*string2 data = kbs


② strupr( ) 함수 : 대문자화 하는 함수 

【 예제13-25 】"kbs"를 "KBS"로 변환하는 프로그램(ch13-25.c)

▶ 프로그램

#include <stdio.h>

#include <stdlib.h>

main()

{

char *string1="kbs";

char *string2;

clrscr(); 

printf("*string1 data = %s\n", string1);

string2 = strupr(string1);

printf("*string2 data = %s\n", string2);

getch();

}

▶ 실행결과

*string1 data = kbs

*string2 data = KBS

③ strrev( ) 함수 : 문자 배열을 반대로 하는 함수 

【 예제13-26 】"Computer"를 "retupmoC"로 변환하는 프로그램(ch13-26.c)

▶ 프로그램

#include <stdio.h>

#include <stdlib.h>

main()

{

char *string1="Computer";

char *string2;

clrscr(); 

printf("*string1 data = %s\n", string1); 

string2 = strrev(string1);

printf("*string2 data = %s\n", string2); 

getch();

}

▶ 실행결과

*string1 data = Computer

*string2 data = retupmoC


 

13-4. 문자열 변환 함수 

출력하고자 하는 문자열을 주어진 형식에 따라 편집하여 주는 함수 

(1) sprintf( ) 함수 

① 문자열을 지정된 서식에 따라 출력을 변환하는 함수

② 형식

#include <stdlib.h>

int sprintf(buffer, format, 출력자료1, 출력자료2, …);

char *buffer; ☞ 출력할 문자열

char *format; ☞ 서식 제어 문자열

③ 출력 자료들을 "format"에 표시된 변환 규칙에 따라 buffer에 넣는다. 편집이 끝난 후에는 '\0'을 제일 끝에 추가시킨다. 

【 예제13-27 】다음 프로그램을 실행하라.(ch13-27.c)

char buf1[10], buf2[14], *p = "KOREA";

① sprintf(buf1, "seoul%d%c", 123, '!');

buf1의 내용:

s

e

o

u

l

1

2

3

!

\0

② sprinf(buf2, "%-5s = %5d", p, 123);

buf2의 내용:

K

O

R

E

A


=




1

2

3

\0

▶ 프로그램

#include <stdio.h>

#include <stdlib.h>

main()

{

char buf1[10], buf2[14];

char *p="KOREA";

clrscr();

sprintf(buf1, "seoul%d%c", 123, '!');

puts(buf1);

sprintf(buf2, "%5s = %5d",p, 123);

puts(buf2);

getch();

}

▶ 실행결과

seoul123!

KOREA = 123

(2) sscanf( ) 함수 

① 표준 입력에서 서식 지정된 값을 읽어 들인다.

② 형식

#include <stdlib.h>

int sscanf(buffer, format, 입력자료1, 입력자료2, …);

char *buffer; ☞ 입력할 문자열

char *format; ☞ 서식 제어 문자열

③ "buffer" 내의 자료를 "format"에 표시된 변환 규칙에 따라 입력자료1, 입력자료2, … 등에 입력시켜 준다. 이 함수의 반환 값은 입력이 성공되면 입력 변수의 개수가 되며, 실패시에는 -1이 된다. 

【 예제13-28 】다음 프로그램을 실행하여라.(ch13-28)

char *buf = "KOREA 12345 3.14", name[10];

float f;

int i, j;

sscanf(buf, "%s%3d%d%f", name, &i, &j, &f);

▷ buf의 내용 :

K

O

R

E

A



1

2

3

4

5


3

.

1

4

\0

▷ 문자 변수 name의 내용 :

K

O

R

E

A

\0

▷ 정수형 변수 i, j와 실수형 변수 f의 내용 :

i의 내용 :

1

2

3

 

j의 내용 :

4

5

f의 내용 :

3

.

1

4

▶ 프로그램

#include <stdio.h>

#include <stdlib.h>

main()

{

char *buf = "KOREA 12345 3.14", name[10];

float f;

int i, j;

clrscr();

sscanf(buf, "%s%3d%d%f", name, &i, &j, &f);

printf("name = %s\ni = %d\nj = %d\nf = %.2f\n", name, i, j, f);

getch();

}

▶ 실행결과

name = KOREA

i = 123

j = 45

f = 3.14

 

출처:http://www.daejin.or.kr/home/hslee2/TC/chap13/chap13-1.htm

Posted by 두장
원문 http://blog.naver.com/pjfile/40012816089

22 프로세스의 시동과 종료

    22.1 프로그램 인수들
    22.2 환경 변수들
    22.3 프로그램 종료

 

∵ getopt() 함수란?  유닉스에서는 프로그램 실행시 옵션으로 '-a','-b'등등을 줄 수 있는 것이

                             많은데 이 처리를 쉽게하기 위해 만들어진 함수가 입니다.
 

프로세스는 시스템 자원들의 할당을 위한 기본적인 동작 단위이다. 각 프로세스는 자신만의 주소 공간(address space)과 제어의 한 쓰레드를 갖는다. 한 프로세스는 한 프로그램을 실행한다; 당신이 같은 프로그램을 실행하는데 여러개의 프로세스를 가질 수 있지만, 각각의 프로세스는 자신의 주소공간에서 자신의 프로그램 복제본을 갖고 다른 프로그램 복사본과 독립적으로 실행된다.

 

일반적으로 우리는 하나의 프로세스를 단위로 하여 독립적인 작업을 수행하는 것으로 알고 있지만, 컴퓨터 기술의 발전으로 프로세스라는 단위는 너무나 큰 단위가 되어버리고 이를 대신하여 쓰레드라는 단위가 사용되게 되었다. 쓰레드를 사용하는 운영체제에서는 작업의 스케줄링을 수행할 때 쓰레드를 단위로 하여 스케줄링을 한다.

 

이 장은 당신의 프로그램에서 프로세스를 시동하고, 그것을 종료시키고, 부모프로세스로 부터 정보(인수들과 환경)를 받기 위하여 무엇을 해야만 하는지를 설명하고 있다.

--------------------------------------------------------------------------------

 

22. 1 프로그램 인수들

 

 시스템은 main 함수를 호출함으로써 C 프로그램을 시작한다. 그것은 당신이 프로그램을 만들 때 main 이라 이름지어진 함수를 꼭 만들어야 함을 의미하고_그것을 하지 않았을 때 에러없이 프로그램을 링크할 수 없을 것이다.

 

main 함수는 아무런 인수를 취하지 않거나, 커멘드 라인에서 받아들이는 인수를 나타내는 두 개의 인수를 취한다. 다음처럼.

int main (int argc, char *argv[])

 

커멘드 라인 인수들은 공백으로 분리된 토큰으로써 프로그램을 호출하도록 쉘 커맨드에 주어진다; 그래서, `cat foo bar'라고 했을 때 인수는 `foo' 와 `bar'가 된다. 어떤 프로그램에서 커맨드 라인에 인수를 넣는 방법은 오직 main함수의 인수를 통해서 가능하다. 만일 main 함수가 인수를 취하지 않는다면, 당신은 커맨드 라인에서 인수를 취할 수 없다.

 

argc 인수는 커맨드 라인 인수들의 개수를 말하고, argv 인수는 C 문자열의 벡터이다;
argv의 각 요소들은 공백으로 분리된 개별적인 커맨드 라인 인수 문자열이다.
실행시키려는 프로그램의 파일이름 또한 첫 번째 요소로써 벡터 안에 포함된다.
argc의 값은 이 요소들의 개수이다. 널 포인터가 항상 마지막 요소가 된다: 즉, argv[argc]는 널 포인터이다. 커맨드 `cat foo bar' 에서, argc는 3이고, argv는 "cat", "foo", 그리고 "bar" 라는 세 개의 요소들을 갖는다. 만일 당신의 프로그램에서 커맨드 라인 인수들의 구분이 간단하다면, 당신은 직접 argv로부터 간단하게 하나씩 인수를 가져올 수 있다. 당신의 프로그램이 한정된 인수들의 개수를 갖지않거나, 모든 인수들을 한꺼번에 취하지 않는다면 같은 방법으로 인수들을 취할 수 있지만, 그렇지 않다면 그것을 구문분석 하기 위해서 getopt를 사용해서 인수들을 취해야 할 것이다.

 

22. 1. 1 프로그램 인수 구문 관례들

 

POSIX에서 커맨드 라인 인수들을 위해서 다음과 같은 관례들을 권장하고 있다. getopt (22. 1. 2 [Parsing Options] 참조)는 다음의 권장사항을 쉽게 충족시키도록 만든다. 하이픈(hyphen (`_') ) 구획문자(delimiter)로 시작하는 인수들은 옵션이 있다.


한 개의 토큰에서 한 개의 하이픈 구획문자 뒤에 따르는 것은, 만일 그 옵션들이 인수들을 취하지 않는다면 다중 옵션이 된다. 그래서, `-abc'는 `-a -b -c'와 동등하다.
옵션 이름들은 단일한 알파벳 문자들이다( isalnum에 관하여; 4. 1절[Classification of Characters] 참조) 어떤 옵션들을 인수를 필요로 한다. 예를 들어, ld 명령의 `-o' 옵션은 출력 파일 이름으로 하나의 인수를 필요로 한다. 옵션과 옵션이 필요로 하는 인수들은 토큰으로 분리되어 나타날 수도 있고, 그렇지 않을 수도 있다. (즉, 그들을 분리하는 공백문자는 선택적이다. ) 그래서, `-o foo'
와 `-ofoo'는 동등한다.


옵션들은 전형적으로 다른 비-옵션 인수들에 선행된다.
GNU C 라이브러리에 있는 getopt의 구현은 당신의 프로그램을 사용하는 사용자가 심지어 옵션과 비-옵션 인수들을 혼합했을지라도, 구문분석을 위해서 모든 비-옵션 인수들 전에 옵션 인수들이 나타나도록 만든다. 인수 `--'는 모든 옵션들을 종결시킨다; 다음에 따르는 인수들은 그들이 하이픈으로 시작할지라도, 비-옵션 인수들로 취급된다.

 

한 개의 하이픈 문자가 들어가 있는 토큰은 보통 비-옵션 인수로써 취급된다. 관례상, 그것은 기본 입력과 출력 스트림으로 입력이나 출력을 정하기 위해서 사용된다. 옵션들은 어떤 순서대로 공급되어지고, 또는 여러번 중복해서 나타나기도 할 것이다. 해석은 특정한 응용 프로그램이 맨 왼쪽에 있다고 해석한다.

 

GNU 는 그들의 관례에 따라서 긴 옵션을 더한다. 긴 옵션들은 `--'뒤에 따르는 이름으로 구성되는데 그 이름은 영숫자와 대쉬들로 구성된다. 옵션 이름들은 전형적으로 하나에서 세 개 단어의 길이를 갖고, 그들은 하이픈으로 단어들을 분리한다. 사용자들은 옵션을 대표하는 약자가 단일하다면 얼마든지 옵션 이름들을 축약할 수 있다. 한 개의 긴 옵션을 위한 인수를 정하기 위해서는, `--name=value'라고 써라. 이 구문은 선택적인 인수를 받아들이는 긴 옵션을 가능하게 한다. GNU 시스템은 쉘에서 긴 옵션 이름을 지원할 것이다.

 

 

22. 1. 2 프로그램 옵션들을 구문 분석하기

이번에는 getopt 함수를 어떻게 호출하는지에 대해서 자세히 설명한다. 이 기능을 사용하기 위해서, 당신의 프로그램에 헤더파일 `unistd. h'를 포함시켜야만 한다.

 

변수 : int opterr

 

만일 이 변수의 값이 0 이 아니면, getopt는 만일 알지 못하는 옵션 문자가 들어오거나 인수를 필요로 하는 옵션이 옵션을 갖고있지 않다면 표준 에러 스트림에 에러메세지를 프린트한다. 이것은 디폴트 동작이다. 만일 당신이 이 변수를 0으로 설정하면, getopt는 아무런 메시지도 프린트하지는 않지만, 에러를 지적하기 위해서 여전히 ? 문자를 여전히 반환한다.

 

변수 : int optopt

 

getopt가 알려지지 않은 옵션 문자와 만나거나 필요한 인수가 빠져있는 옵션일 때, getopt는 그 옵션 문자를 이 변수에 저장한다. 당신은 자신만의 진단 메시지를 제공하기 이해서 이 변수를 사용할 수 있다.

변수 : int optind

 

이 변수는 앞으로 분석할 배열 argv의 다음 요소에 대한 인덱스로 getopt에 의해 설정된다. 일단 getopt가 옵션 인수들 모두를 발견했다면, 당신은 나머지 비-옵션 인수들이 어디에서 시작하는지 결정하기 위해서 이 변수를 사용할 수 있다. 이 변수의 초기값은 1이다.

 

변수 : chat *optarg

 

이 변수는 인수들을 받아들이는 옵션들을 위해서, 옵션 인수들의 값을 가리키는 포인터로써 getopt에 의해 설정된다.

 

함수 : int getopt(int argc, char **argv, const char *options)

 

getopt 함수는 argv와 argc 인수들에 의해 지정된 인수 목록으로부터 다음 옵션 인수를 얻는다. 보통, 그들 값들은 main에 의해 받아들여진 인수들로부터 직접적으로 온다. 옵션 인수는 이 프로그램에서 유용하게 쓰일 옵션 문자들을 지정한 문자열이다.

문자열 안에 있는 옵션 문자는 인수가 필요함을 알리기위해서 콜론(`: ')의 다음에 나타난다.

 

만일 옵션 인수 문자열이 하이픈(`-')으로 시작한다면, 이것은 특별하게 취급된다. 그들은 옵션 문자가 `\0'인 것처럼 반환되어, 옵션이 없는 인수들을 허용한다. getopt 함수는 다음 커맨드 라인옵션의 옵션 문자를 반환한다. 더 이상 유용한 옵션 인수들이 없을 때, -1을 반환한다. 그곳은 이제 비-옵션 인수들이 있을 것이다; 당신은 이것을 체크하기 위해서 argc 파라미터에 대응하는 외부변수 optind를 비교해야만 한다. 만일 어떤 옵션이 인수를 가진다면, getopt 는 변수들 optarg안에 그것을 저장함으로써 인수를 반환한다. 당신이 덧씌워질지도 모르는 정적 변수가 아닌, 보통의 argv 배열을 가리키는 포인터를 라면, optarg 문자열을 복사할 필요가 없다. 만일 알려지지 않은 옵션문자를 사용하거나, 옵션 인수가 빠져있다면 getopt는 `?'를 반환하고 현재 옵션 문자로 외부변수 optopt를 설정한다. 만일 옵션의 첫 번째 문자가 콜론(`: ') 이라면, getopt는 옵션 인수가 빠져있음을 알리기위해서 `?' 대신에 `: '를 반환한다. 또한, 만일 외부변수 opterr이 0이 아니면(디폴트이다. ), getopt는 에러 메시지를 출력한다.

 

 

22. 1. 3 getopt를 사용해서 인수를 구문 분석하는 예제

 

다음은 getopt가 전형적으로 어떻게 사용되는지를 보여주는 예제이다. 핵심은 다음과 같다:

보통, getopt는 루프 안에서 호출된다. getopt가 더 이상 나타난 옵션이 없음을 알리기위해서 -1을 반환 하면, 루프는 종료한다. switch 구문은 getopt로부터의 반환값에 따른 각각의 처리에 사용된다. 각각의 경우는 프로그램에서 나중에 사용될 변수를 설정하게 된다. 두 번째 루프는 남아있는 비-옵션 인수들을 처리하는데 사용된다.

 

#include <unistd. h>

#include <stdio. h>

 


int main (int argc, char **argv)
{
    int aflag = 0;
    int bflag = 0;
    char *cvalue = NULL;
    int index;
    int c;
    opterr = 0;
    
    while ((c = getopt (argc, argv, "abc: ")) != -1) 
    {
        switch (c)
        {
            case 'a':
                aflag = 1;
                
                break;
                
            case 'b':
                bflag = 1;
                break;
            
            case 'c':
                cvalue = optarg;
                break;
            
            case '?':
            if (isprint (optopt))
                fprintf(stderr, "Unknown option `-%c'. \n", optopt);
            else
                fprintf (stderr,
            
            "Unknown option character `\\x%x'. \n", optopt);
            
            return 1;
            
            default:
            
            abort ();
            
        }
    }
    
    printf("aflag = %d, bflag = %d, cvalue = %s\n", aflag, bflag, cvalue);
        
    for (index = optind; index < argc; index++)
        printf ("Non-option argument %s\n", argv[index]);
    
    return 0;    
}

 

다음은 위의 프로그램을 여러 가지 인수들의 조합을 사용했을 때 어떤 결과를
나타내는지에 대한 예이다.

% testopt

aflag = 0, bflag = 0, cvalue = (null)

 

% testopt -a -b

aflag = 1, bflag = 1, cvalue = (null)

 

% testopt -ab

aflag = 1, bflag = 1, cvalue = (null)

 

% testopt -c foo

aflag = 0, bflag = 0, cvalue = foo

 

% testopt -cfoo

aflag = 0, bflag = 0, cvalue = foo

 

% testopt arg1

aflag = 0, bflag = 0, cvalue = (null)

Non-option argument arg1

 

% testopt -a arg1

aflag = 1, bflag = 0, cvalue = (null)

Non-option argument arg1

 

% testopt -c foo arg1

aflag = 0, bflag = 0, cvalue = foo

Non-option argument arg1

 

% testopt -a -- -b

aflag = 1, bflag = 0, cvalue = (null)

Non-option argument -b

 

% testopt -a -

aflag = 1, bflag = 0, cvalue = (null)

Non-option argument -

 

22. 1. 4 긴 옵션들을 구문 분석하기

단일한-문자 옵션들로만 되어있는 GNU-스타일의 긴 옵션들을 받아들이기 위해서는 getopt 대신에 getopt_long를 사용한다. 당신은 이런 가외의 작은 작업을 통해서 모든 프로그램이 긴 옵션들을 받아들이게 만들 수 있고, 초보자들에게 어떻게 그 프로그램을 사용하는지 도울 수 있다.

 

데이터 타입 : struct option

 

이 구조체는 getopt_long을 위한 단일한 긴 옵션 이름을 설명한다. 긴 옵션을 구성하는 옵션의 하나인 인수 longopts는 그들 구조체의 배열이 되어야만 한다. 그 배열은 0으로 채워진 요소로써 끝난다. struct option 구조체는 다음과 같은 필드를 갖는다.

 

const char *name

 

이 필드는 옵션의 이름으로 문자열이다.

int has_arg

이 필드는 옵션이 인수를 취하는지 또는 취하지 않는지의 여부를 알린다. 그것은 정수이고 그곳에 세 개의 합리적인 값들이 있다: no_argument, required argument, 그리고 optional_argument.

 

int *flag

int val

 

이 필드들은 그 옵션이 발생할 때 옵션에 대하여 어떻게 보고를 하거나 동작할 것인지를 제어한다. 만일 flag가 널 포인터라면, val은 이 옵션을 대표하는 값이다. 종종 그 값들은 특정한 긴 옵션들의 단일함을 확인하기 위해서 선택되어진다. 만일 플래그가 널 포인터가 아니라면, 그것은 이 옵션을 위한 플래그인 int형 변수의 주소가 되어질 것이다. val안의 값은 나타난 옵션을 지적하도록 플래그 안에 저장하기위한 값이다.

 

함수 : int getopt__long (int argc, char **argv, const char *shortopts, struct
option *longopts, int *indexptr)

 

벡터 argv ( 길이는 argc이다. )로부터 옵션들을 해독한다. 인수 shortopts는 getopt가 해독할 수 있는 만큼의 짧은 옵션을 나타내고, 인수 longopts는 받아들이기 위한 긴 옵션들을 나타낸다. getopt_long이 짧은 옵션을 만났을 때, 그것은 getopt가 하는것과 같은 일을 한다: 그것은 옵션을 위한 문자 코드를 반환하고, optarg에 옵션 인수들을(만일 그것이한 개를 가진다면) 저장한다.

getopt_long가 긴 옵션을 만났을 때, 그것은 그 옵션을 정의하는 flag 와 val 필드에 기초한 동작들을 취한다.

 

만일 flag가 널 포인터라면, getopt_long 은 발견한 옵션을 지적하도록 val의 내용을 반환한다. 당신이 다른 의미를 가진 옵션을 위해서 val 필드 안에 별개의 값들을 배열하면, 당신은 getopt_long이 반환한 후에 그들 값을 해독할 수 있다. 만일 긴 옵션이 짧은 옵션과 동일하다면, 당신은 짭은 옵션의 문자 코드를 사용할 수 있다.

 

만일 flag가 널 포인터가 아니라면, 단지 프로그램 안에서 flag가 설정된 이 옵션을 의미한다. flag는 당신이 정의한 int형의 변수이다. flag 필드 안에 그 플래그의 주소를 저장하라. flag에 저장하려는 옵션값을 val 필드 안에 저장하라. 이 경우, getopt_long는0을 반환한다.

 

어떤 긴 옵션에서, getopt_long는 배열 longopts안의 옵션 정의에 대한 인덱스를, *indexptr에 저장하여 알린다. 당신은 longopts[*indexptr]. name 어로 옵션의 이름을 얻을 수 있다. 그래서 당신은 그들의 val 필드 안에 있는 값이나, 그들의 인덱스에 의해서 긴 옵션들을 구분할 수 있다. 당신은 플래그를 설정한 긴 옵션들을 이 방법으로 구분할 수 있다.

 

어떤 긴 옵션이 인수를 가질 때, getopt_long는 반환하기 전에 변수 optarg안에 인수값을 저장한다. 어떤 옵션이 아무런 인수를 가지지 않을 때, optarg안의 값은 널 포인터이다. 이것은 공급된 인수가 옵션을 가졌는지 아닌지에 대한 여부를 당신에게 알리는 방법인 것이다. getopt_long는 더 이상 처리할 옵션들이 없을 때, -1을 반환하고, 다음 남아있는 인수의 argv 인덱스를 변수 optind 안에 남긴다.

 

22. 1. 5 긴 옵션들의 구분분석에 대한 예제

 

#include <stdio. h>
/* 플래그는 `--verbose' 에 의해 설정한다. */

static int verbose_flag;
int main (argc, argv)
int argc, char **argv;
{
    int c;

    while (1)
    {
        static struct option long_options[] =
        {
            /* 그들 옵션들은 플래그를 설정한다. */
            {"verbose", 0, &verbose_flag, 1}, {"brief", 0, &verbose_flag, 0},
            /* 그들 옵션들은 플래그를 설정하지 않는다. 우리는 그들의 인덱스에 의해 그들을 구분한다. */
            {"add", 1, 0, 0},{"append", 0, 0, 0},{"delete", 1, 0, 0},{"create", 0, 0, 0},
            {"file", 1, 0, 0},{0, 0, 0, 0}}
        };

        /* getopt_long는 이곳에 옵션 인덱스를 저장한다. */
        int option_index = 0;
        c = getopt_long(argc, argv, "abc: d: ", long_options, &option_index);

        /* 옵션들의 끝을 검출한다. */
        if (c == -1)   break;

        switch (c)
        {

            case 0:

                /* 만일 이 옵션이 플래그를 설정하면, 지금 아무런 일도 하지 말아라. */
                
                if (long_options[option_index]. flag != 0) break;
                
                printf("option %s", long_options[option_index]. name);
                
                if (optarg) printf(" with arg %s", optarg);
                
                printf("\n");
                
                break;

            case 'a':
                puts("option -a\n");
                break;
            
            case 'b':
                puts("option -b\n");
                break;

            case 'c':
                printf("option -c with value `%s'\n", optarg);
                break;

            case 'd':
                printf("option -d with value `%s'\n", optarg);
                break;

            case '?':
                /* getopt_long는 이미 에러 메시지를 프린트했다. */
                break;

            default:
                abort ();

        } /* switch 의 끝*/

    } /* while 의 끝 */


    /* 그들이 맞추었던 것으로 `--verbose'와 `--brief'를 보고하는 대신에, 우리는
    그들로부터 나온 결과로 마지막 상황을 보고한다. */
    
    if (verbose_flag)  
        puts ("verbose flag is set");
    
        
    /* 남아있는 코맨드 라인 인수들을( 옵션이 없는) 출력하라. */    
    if (optind < argc) 
    {
        printf ("non-option ARGV-elements: ");
    
        while (optind < argc)    
            printf ("%s ", argv[optind++]);
    
        putchar ('\n');    
    }

    exit (0);
}

--------------------------------------------------------------------------------

 

22. 2 환경 변수들

프로그램이 실행될 때, 두 가지 방법으로, 실행될 문맥(context)에 대한 정보를 받는다. 첫 번째 방법은 argv와 argc 인수를 메인 함수에서 사용하는 것으로써 이것에 대한 것은 22. 1절 [Program Arguments] 에서 설명하였다. 두 번째 방법은 환경변수를 사용하는 것인데 지금부터 설명할 것이다. argv를 사용하는 방법은 실행될 특정한 프로그램에 지정된 커맨드 라인 인수를 주기 위해서 전형적으로 사용된다. 다른 방법으로, 환경은, 드물게 변경되고 덜 빈번하게 억세스 되는, 많은 프로그램에 의해 분배될 정보를 기억한다.

이 절에서 논의되고 있는 환경변수들은 당신이 쉘에게 커맨드를 보내고 사용될 것을 배정하는 환경변수와 같은 것이다. 쉘로부터 실행된 프로그램들은 쉘로부터 환경변수 모두를 상속받는다. 표준 환경 변수들은 사용자의 홈 디렉토리, 터미널 타입, 현재 지역 등등에 대한 정보를 위해서 사용된다; 당신은 다른 목적으로 부가적인 환경변수를 정의할 수 있다. 모든 환경변수들의 가진 값들의 집합은 집합적으로 환경으로써 알려진다. 환경변수들의 이름은 대소문자를 구분하고 문자 `='를 포함해서는 안된다.  시스템-정의 환경변수들은 항상 대문자이다. 환경변수들의 값은 문자열로써 표현될 수 있는 어떤 것도 가능하다. 값에는 널 문자가 포함 되서는 안된다, 왜냐하면 이것은 문자열의 끝으로 간주되기 때문이다.

 

22. 2. 1 환경 검색

환경변수의 값은 getenv 함수를 통해서 억세스될 수 있다. 이것은 헤더 파일 `stdlib.h'에 선언되어 있다.

 

함수 : char *getenv (const char name)

 

이 함수는 환경변수 name의 값인 문자열을 반환한다. 당신은 이 문자열을 갱신할 수 없다. 어떤 GNU 라이브러리를 사용하지 않는 비-유닉스 시스템들은 getenv 함수의 연속적인 호출에 의해서 덮어 쓰여질지 모른다(다른 라이브러리 함수에 의하지 않는다. ) 만일 환경변수 name이 정의되지 않는다면, 그 값은 널 포인터이다.

 

함수 : int putenv (const char *string)

 

putenv 함수는 환경으로부터 정의를 더하거나 제한다. 만일 string이 `name=value'의 형식이라면, 그 정의는 환경에 더해진다. 그렇지 않다면, 그 string은 환경변수의 이름으로써 해석되고, 환경 안에서 이 변수에 대한 정의가 제거된다. GNU 라이브러리는 SVID와의 호환성을 위해서 이 함수를 제공하고 있고; 다른 시스템에서 이 함수 는 유용하지 않다.

당신은 환경에 더 많은 변수들을 더하기 위해서 환경 오브젝트의 내재된 표현을 직접적으로 다룰 수 있다( 예로, 당신이 실행하려는 것에 대해서 다른 프로그램으로 통신하기 위해서; 23. 5절 [Executing a File] 참조).

 

변수 : chat **environ

 

환경은 문자열의 배열로써 표현된다. 각 문자열은 `name=value'의 형식을 갖는다.
환경 안에 나타난 문자열의 순서는 중요하지 않지만, 같은 이름이 한번 이상 나타나서는 결코 안된다. 배열의 마지막 요소는 널 포인터이다. 이 변수는 헤더파일 `unistd. h'에 선언되어 있다. 만일 당신이 환경변수의 값을 얻기 원한다면 getenv를 사용하라.

 

22. 2. 2 표준 환경 변수들

그들 환경변수들은 표준 의미를 갖는다. 이것은 그들이 항상 환경 안에서만 나타남을 의미하지는 않는다; 그러나 그 변수들이 어디에서든 나타난다고 해도 그들은 그들만의 의미를 갖기 때문에 당신이 다른 목적으로 환경변수 이름을 사용하려고 시도해서는 안된다.

 

HOME

이것은 사용자의 홈 디렉토리나, 초기 디폴트 작업 디렉토리를 나타내는 문자열이다. 사용자는 어떤 값으로 HOME를 설정할 수 있다. 만일 당신이 어떤 특정한 사용자를 위해서 적당한 홈 디렉토리를 부여하기를 원한다면, HOME을 사용할 수 없고; 대신에, 사용자 데이터 베이스에서 사용자의 이름을 찾아보라 ( 25. 12절 [User Database] 참조). 대부분의 목적에서는, HOME을 사용하는 것이 좋다, 왜냐하면 정확하게 사용자가 그 값을 정하도록 허용하기 때문이다.

 

LOGNAME

이것은 로그 인 하기 위해서 사용되는 사용자 이름이다. 환경에서 이 값은 제멋대로 조정될 수 있기 때문에, 이것은 프로세스를 실행시키고 있는 사용자를 구분하기 위한 신뢰 가능한 방법이 아니다; getlogin과 같은 함수(25. 11 [Who Logged In] 참조)는 그러한 목적을 위해서는 오히려 더 낫다. 대부분의 목적을 위해서는 LOGNAME이 사용자가 그값을 지정하도록 하기 때문에 사용하기 더 좋다.

 

PATH

경로는 파일을 찾기 위해서 사용되는 디렉토리 이름들의 열(sequence) 이다. 변수 PATH는 실행시키려는 프로그램을 찾기 위해서 사용되는 경로는 저장하고 있다. execlp와 execvp 함수들은 (23. 5절 [Executing a File] 참조) 그들 함수들에 의하여 실행된 쉘과 다른 유틸리티에서, 이 환경변수를 사용한다. 경로의 구분은 콜론으로 분리된 디렉토리 이름들의 순차열(sequence) 이다. 디렉토리 이름 대신에 빈 문자열은 현재의 디렉토리를 나타낸다( 9. 1절 [Working Directory] 참조).

 

이 환경변수의 전형적인 값은 다음과 같은 문자열이 될 것이다.

: /bin: /etc: /usr/bin: /usr/new/X11: /usr/new: /usr/local/bin

 

TERM

이것은 프로그램 출력을 받아들이는 터미널의 종류를 지정한다. 어떤 프로그램들은 터미널의 특정한 종류에 의해 지원되는 특별한 이스케이프 시퀀스 또는 터미널모드들을 이용하기 위해 이 정보를 사용하게 만들 수 있다. termcap 라이브러리( Termcap 라이브러리 매뉴얼에서 "Finding a Terminal Description" 절을 참고)를 사용하는 많은 프로그램들은 TERM 환경변수를 사용한다.

 

TZ

이것은 시간대(time zone)를 지정한다. 이 문자열의 형식과 어떻게 그것을 사용하는지에 대한 자세한 정보는 17. 2. 5절 [TZ Variable] 참조. LANG 속성 범주를 사용하도록 디폴트 지역을 지정한다.

 

LC_ALL

범주를 위한 환경변수가 아니면 설정한다. 지역에 대한 자세한 정보를 19장 [Locales]
참조.

 

LC_COLLATE

이것은 문자열 정렬을 위해서 어떤 지역을 지정한다.

 

LC_CTYPE

이것은 문자 집합(sets)과 문자 분류를 위해 사용하도록 어떤 지역을 지정한다.

 

LC_MONETARY

이것은 형식화된 통화량 값을 사용하기 위한 어떤 지역을 지정한다.

 

LC_NUMERIC

이것은 형식화된 숫자들을 사용하기 위한 어떤 지역을 지정한다.

 

LC_TIME

이것은 형식화된 날짜/시간값들을 위해서 어떤 지역을 지정한다.

 

_POSIX_OPTION_ORDER

만일 이 환경변수가 정의되었다면, 그것은 getopt에 의한 커맨드 라인 인수의 재정리를 금지한다. 22. 1. 1절 [Argument Syntax] 참조)


--------------------------------------------------------------------------------

22. 3 프로그램 종료

프로그램을 종료시키는 평상적인 방법은 메인 함수가 반환하도록 하는 것이다. 메인
함수로부터 반환되는 분기(exit) 상황 값은 프로세스의 부모 프로세스나 쉘에게
정보를 보고하기 위해서 사용된다. 프로그램은 exit 함수를 호출함으로써 또한 종료할
수 있다. 또한, 프로그램은 시그널들에 의해서 종료될 수 있다; 이것은 21장 [Signal
Handling] 에 자세하게 설명되어 있다. abort함수는 프로그램을 죽이는(kill)
시그널을 발생시킨다.

 

22. 3. 1 보통의 종료

프로세스는 프로그램이 exit를 호출할 때 보통 종료된다. main 함수로부터의 반환은 exit 를 호출하는것과 같고, main이 반환한 값은 exit에 인수로써 사용된다.

 

함수 : void exit (int status)

 

exit 함수는 상황 status로 프로세스를 종료한다. 이 함수는 반환하지 않는다.

보통의 종료는 다음과 같은 동작들의 원인이 된다:

 

1. atexit 나 on_exit 함수들에 등록된 함수들은 등록의 역순으로 호출되어진다. 이 메커니즘은 프로그램이 종료할 때 수행되어지는 자신만의 "cleanup" 동작들을 지정하도록 당신의 응용프로그램에게 허용한다. 전형적으로, 이것은 파일에 프로그램 상황 정보를 저장하거나, 공유 데이터베이스에서 락들을 해제하는것과 같은 일들을 하는데 사용된다.

 

2. 버퍼된 출력 데이터가 모두 기록되어, 개방된 모든 스트림이 폐쇄되었다. 7. 4절 [Closing Streams] 참조. 또한, tmpfile 함수에의해 개방되었던 임시 파일들은 제거된다; 9. 10절 [Temporary Files] 참조.

 

3. 프로그램을 종료시키도록 _exit가 호출되었다. 22. 3. 5절 [Termination
Internals] 참조.

 

22. 3. 2 Exit 상황들

프로그램이 종료할 때, 그것은 분기 상황(exit status)을 사용해서, 종료의 원인에 대한 작은 양의 정보를 부모 프로세스에게 반환할 수 있다. 이것은 현존하는 프로세스가 exit에게 인수로써 주는 0에서 255사이의 값이다. 보통 당신은 성공이나 실패에 대한 매우 광범위한 정보를 보고하기 위해서 exit 상황을 사용할 것이다.  당신은 실패의 이유에 대해서 매우 자세하게는 정보를 줄 수는 없고, 대부분의 부모 프로세스도 더 이상 세밀한 정보를 원하지 않을 것이다.

 

어떤 프로그램이 반환하는 값은 어떤 부류의 상황 값에 속한다. 대부분의 관습은 성공하면 0이고 실패하면 1이다. 그러나 비교를 수행하는 프로그램은 다른 관습을 사용한다: 매치되지 않았음을 지적하기 위해서 1을 사용하고 비교 불가능임을 지적하기 위해서 2를 사용한다. 당신의 프로그램이 그것을 위한 종료관습을 이해하려면 종료관습을 따라야한다. 일반적인 관습은 상황 값으로 128개를 예약하고 특별한 목적을 위해서 확장한다.  특별하게, 128개의 값은 서브프로세스에서 다른 프로그램에게 실패를 지적하기 위해서 사용된다. 이 관습은 보편적으로 제공되지는 않지만, 당신의 프로그램이 그것을 따르도록 하는 것이 좋다.

 

주의 : 분기상황으로써 에러들의 개수를 사용하려고 시도하지 말아라. 이것은 실제로 매우 유용하지 않다; 부모 프로세스는 얼마나 많은 에러들이 발생했는지에 주의를 기울이지 않는다. 그것보다 더 심각한 경우로는, 상황 값이 8비트에서 짤리기 때문에 만일 프로그램에서 256개의 에러를 보고한다면, 부모 프로세스는 0개의 에러가 난 것으로 보고를 받을 것이고_결국 성공한 것으로 되어버린다. 같은 이유로, 255개를 초과할 수 있기 때문에 종료의 상황으로써 에러의 개수를 사용하여 작업하지 말아라.

 

이식성 노트: 어떤 비-POSIX 시스템들은 종료 상황 값들을 위해서 다른 관습을 사용한다. 좀더 좋은 이식성을 위해서는, 성공과 실패를 위한 상황 값으로 매크로 EXIT_SUCCESS 와 EXIT_FAILURE 를 사용할 수 있다. 그들은 헤더파일 `stdlib. h'에 선언되어 있다.

 

매크로 : int EXIT__SUCCESS

 

이 매크로는 성공적인 프로그램 수행을 알리기위해서 exit 함수와 함께 사용될 수 있다. POSIX 시스템에서, 이 매크로의 값은 0이고, 다른 시스템에서 이 값은 어떤 다른 정수 표현( 아마도 비-상수 )이 될 것이다.

 

매크로 : int EXIT__FAILURE

 

이 매크로는 비성공적인 프로그램 수행을 알리기위해서 exit 함수와 함께 사용될 수 있다. POSIX 시스템에서, 이 매크로의 값은 1이다. 다른 시스템들에서 그 값은 어떤 다른 정수 표현( 아마도 비-상수 )이 될 것이다. 다른 0이 아닌 상황 값들은 앞으로의 일을 알린다. 어떤 프로그램들은 특정한 종류의 "비-성공"을 알리기위해서 다른 0이 아닌 상황 값들을 사용한다. 예를 들어, diff는 파일들이 서로 다름을 의미할 때 상황 값 1을 사용하고, 파일을 개방하기가 어렵다면 2 또는 그 이상의 값을 사용한다.

 

22. 3. 3 종료시의 상황정리

당신의 프로그램에서 보통의 종료가 발생하면 그 자신만의 정리(cleanup) 함수를 실행하여 정돈할 수 있다. 만일 당신이 여러 개의 응용 프로그램에서 한 개의 라이브러리를 사용하고 있을 때, 모든 응용프로그램이 종료되기전에 라이브러리의 정리(cleanup) 함수들을 명시적으로 호출한다면 신뢰성이 없다. atexit 또는 on_exit를 사용해서 라이브러리 그 자체에서 정리 함수를 설정함으로써, 응용 프로그램에게는 보이지 않는 정리(cleanup)함수를 만드는 것이 더 신뢰성 있는
프로그램이 된다.

 

함수 : int atexit (void (*function) (void))

 

atexit 함수는 프로그램이 정상적으로 종료하면 호출되도록 함수 function을 등록한다. 그 function은 아무런 인수가 없이 호출된다. atexit로부터의 반환값은 성공하면 0이고 만일 그 함수가 등록될 수 없으면 0이 아닌 값을 반환한다. 

 

함수 : int on__exit (void (*function)(int status, void *arg), void *arg)

 

이 함수는 atexit 보다는 좀더 다양함을 구사할 수 있는 것이다. 이 함수는 두 개의 인수로써 함수 function과 포인터 arg를 받아들인다. 정상적이 프로그램 종료시하다, 그 function은 두 개의 인수들, 즉 exit에 주었던 상황 값과 arg와 함께 호출된다. 이 함수는 SunOS와의 호환성을 위해 GNU C 라이브러리에 포함되었으며, 다른 시스템에서는 지원되지 않을 것이다.

 

다음은 exit 와 atexit 의사용을 설명하는 프로그램 예제이다.

 

#include <stdio. h>

#include <stdlib. h>

 

void bye (void)

{

    puts ("Goodbye, cruel world. . . . ");

}

 

int main (void)

{

    atexit (bye);

    exit (EXIT_SUCCESS);

}

 

이 프로그램이 실행됐을 때, 단지 메시지를 프린트하고 종료한다.

 

22. 3. 4 프로그램 중지시키기

당신은 abort 함수를 사용하여 당신의 프로그램을 중지시킬 수 있다. 이 함수를 위한 프로토타입은 `stdlib. h'에 있다.

 

함수 : void abort (void)

 

abort 함수는 비정상적으로 프로그램을 종료시킨다. 이것은 atexit 또는 on_exit로 등록된 정리(cleanup)함수들을 실행하지 않는다. 이 함수는 SIGABRT 시그널을 발생시킴으로써 프로세스를 종료시키고, 당신의 프로그램은 이 시그널을 가로채서 처리하는 핸들러를 포함할 수 있다.

 

22. 3. 5 내부적 종료

_exit 함수는 exit에 의해서 프로세스를 종료하기 위해서 사용되는 기본 동작이다.
이것은 `unistd. h'에 선언되어 있다.

 

함수 : void __exit (int status)

 

_exit 함수는 상황 status로 프로세스가 종료되도록 하는 기본 동작(primitives)이다.
이 함수를 호출하는 것은 atexit 또는 on_exit에 등록된 정리(cleanup) 함수들이 실행되지 않는다.

명백히 종료를 호출하거나, 또는 시그널의 결과에 의한 종료이거나_어떤 이유에 의해서 프로세스가 종료될 때, 다음과 같은 일이 발생한다. 프로세스에서 모든 개방된 파일 기술자들은 폐쇄된다. 8장 [Low-Level I/O] 참조.

종료 상황 코드의 하위 8비트는 wait 나 waitpid를거쳐서 부모 프로세스에게 보고되도록 저장된다; 23. 6절 [Process Completion] 참조. 종료된 프로세스의 어느 자식 프로세스들은 새로운 부모 프로세스가 할당된다.
(이것은 프로세스 ID 1로서, 처음의 프로세스이다. )

SIGCHLD 시그널은 부로 프로세스에게 보내어진다.

만일 그 프로세스가 제어중인 터미널을 가진 세션 리더(session leader)라면, SIGHUP 시그널은 전면 작업에 있는 각각의 프로세스에게 보내어 지고, 제어중인 터미널은 세션으로부터 분열된다. 24장 [Job Control] 참조. 어떤 프로세스의 종료가 프로세스 그룹을 고아가 되도록 하고, 프로세스 그룹의 어떤 멤버를 멈추도록 하는 원인이 된다면, SIGHUP 시그널과 SIGCONT 시그널이 그룹에 있는 각각의 프로세스에게 보내어진다. 24장 [Job Control] 참조.

Posted by 두장

string.h 함수 정리 (형식/기능)

 

 

함수명

형식 / 기능

strlen()

unsigned strlen( const char *str )

str 문자열 길이를 반환

strcat()

char *strcat( char *str1, const char *str2 )

str1의 문자열에 str2 문자열을 연결

strncat()

char *strncat( char *str1, const char *str2, unsigned c )

str1의 문자열에 str2 문자열의 선두 c개의 문자를 연결

strcmp()

char *strcmp( char *str1, const char * str2 )

str1의 문자열과 str2 서로 부호 없는 비교,
str1>str2
이면 양수값 반환 / str1<str2 이면 음수값 반환 / str1=str2 이면 0을 반환

strncpm()

char *strncpm( char *str1, const char *str2, unsigned c )

str1 문자열의 선두 c개의 문자와 str2 문자열을 비교

strcpy()

char *strcpy( char *str1, const char *str2 )

str1의 문자열에 str2 문자열을 복사, str1의 값을 반환함.

strncpy()

char *strncpy( char *str1, const char *str2, unsigned c )

str1의 문자열에 str2 문자열의 선두 c개의 문자를 복사

strstr()

char *strstr( const char *str1, const char *str2 )

문자열 str2가 문자열 str1에서 처음 일치하는 위치를 알려준다. 만약 문자열이 발견 되면 str1에 있는 그 문 자열의 포인터를 반환한다. 그 외에는 NULL 포인터를 반환한다.

strerror()

char *strerror( int num )

오류번호 num을 받아 해당하는 오류 메시지를 반환

strpbrk()

char *strpbrk( char *str1, const char *str2 )

지정한 str1의 문자열에서 str2의 문자열에 포함된 어떤 문자를 찾고 위치 포인터를 반환

strrchr()

char *strrchr( const char *str, int c )

문자열 str에서 c가 마지막으로 나타나는 위치를 알려준다. c가 발견되면 c의 포인터 를 반환한다. 그 외에는 NULL포인터를 반환한다.

strcspn()

char *strcspn( char *str, const char *str2 )

str1의 문자열에서 str2의 문자열에 포함된 문자가 첫 번째 나타날 때 까지의 문자수

strspn()

char *strspn( char *str1, const char str2 )

str1의 문자열에서 str2의 문자열에 포함되지 않은 문자가 첫 번째 나타날 때까지의 문자수

strtok()

char *strtok( char *str1, const char *str2 )

일련의 strtok 호출은 문자열 str1을 문자열 str2가 가지고 있는 문자로 구분되는 '토큰'으로 나눈다. 첫 번째 호출은 첫 번째 인수인 str1을 사용하여 두 번째 호출부터는 NULL을 첫 번째 인수로 사용한다. 매 호출마다 현재 토큰의 포인터를 반환한다. 더 이상 토큰이 없으면 NULL을 반환한다 .

strupr()

char *strupr( char *str )

지정한 str의 문자열 중 소문자를 대문자로 변환

 

 

또 다른 글 =============================================================================================

 

stpcpy

원형 : char *stpcpy( char *dest, char *src );

헤더 : string.h

기능 : 문자열 src를 문자배열 dest로 복사한다. dest 의 길이가 src 보다 작은 경우 dest 뒤의 인접 데이터가 파괴된다.

리턴 : dest + strlen(src)의 번지를 리턴

 

 strcat

원형 : char *strcat( char *dest, const char *src );

헤더 : string.h

기능 : 문자열끼리 연결한다. dest의 널문자 위치에 src가 붙는다. dest의 길이가 ( dest 문자열 + src 문자열 ) 길이보다 작을 경우 인접 데이터가 파괴된다.

리턴 : dest의 번지가 리턴

 

 strchr

원형 : char *strchr( const *src, int c );

헤더 : string.h

기능 : 문자열 배열 src 내에 문자 c가 있는지 검사하고 있을 경우 문자 c가 있는 번지를 리턴. 널문자도 문자로 취급하기 때문에 널문자를 넣으면 첫번째 널문자의 번지를 리턴한다.

리턴 : 문자열 src내에서 발견된 문자 c의 포인터. 발견되지 않을 경우 NULL 리턴

 

 strcmp

원형 : int strcmp( const char *src1, const char *src2 );

헤더 : string.h

기능 : 두 개의 문자열을 대소 비교함. 이 함수를 사용하여 두 개의 문자열이 같은 문자열인지 아닌지를 비교할 수 있다. 같을 경우 0, 다를 경우 양수나 음수의 값을 리턴.

리턴 : src1 < src2  인 경우 음수 리턴

         src1 = src2  인 경우 0 리턴

         src1 > src2  인 경우 양수 리턴

 

 strcmpi

원형 : int strcmpi( const char *src1, const char *src2 );

헤더 : string.h

기능 : 두 개의 문자열을 대소 비교함. 하지만 대소문자를 구분하지 않는다. 이 함수를 사용하여 두 개의 문자열이 같은 문자열인지 아닌지를 비교할 수 있다. 같을 경우 0, 다를 경우 양수나 음수의 값을 리턴.

리턴 : src1 < src2  인 경우 음수 리턴

         src1 = src2  인 경우 0 리턴

         src1 > src2  인 경우 양수 리턴

 

 strcoll

원형 : int strcoll( char *src1, char *src2 );

헤더 : string.h

기능 : setlocale 함수에 의해 지정된 비교방식에 따라 두 개의 문자열을 비교

리턴 : src1 < src2  인 경우 음수 리턴

         src1 = src2  인 경우 0 리턴

         src1 > src2  인 경우 양수 리턴

 

 strcpy

원형 : char *strcpy( char *dest, const char *src );

헤더 : string.h

기능 : 문자열 src를 문자배열 dest로 복사한다. dest 의 길이가 src 보다 작은 경우 dest 뒤의 인접 데이터가 파괴된다.

리턴 : dest의 번지가 리턴

 

 strcspn

원형 : size_t strcspn( const char *src1, const char *src2 );

헤더 : string.h

기능 : 문자열 src1 중에 문자열 src2에 들어 있지 않은 문자들이 연속해 있는 길이를 구한다. 문자열 s2에 없는 문자들로 구성되어 있는 문자열 s1 내의 세그먼트를 찾아내고 그 세그먼트의 길이를 리턴.

예를 들어 src1 = "123456" 이고 src2 = "0486" 이라면 src1 내에서 src2 의 문자인 4가 나오기 전까지의 길이인 3을 리턴한다.

리턴 : 찾아낸 세그먼트의 길이만약 0을 리턴한다면 세그먼트가 발견되지 않은 것이다.

 

 strdup

원형 : char *strdup( const char *src );

헤더 : string.h

기능 : 새로운 메모리를 할당하고 문자열 src를 복사한 후 그 포인터를 리턴한다. 종료 시 반드시 복제된 문자열은 메모리를 해제해 주어야 한다.

리턴 : 복제된 문자열의 포인터를 리턴. 메모리 할당에 실패한 경우 NULL을 리턴.

 

 _strerror

원형 : char *_strerror( const char *src );

헤더 : string.h, stdio.h

기능 : 사용자가 정의하는 에러 메시지를 만든다. src NULL일 경우 최근 발생한 에러 메시지만으로 구성된 문자열을 만들고 src NULL이 아닌 경우 에러메시지 형식의 문자열을 만든다.

만약 src "babo" 이면 babo : 최근 에러 메시지 같은 형식으로 문자열을 만든다.

리턴 : 만들어진 에러 문자열의 포인터를 리턴한다.

 

 strerror

원형 : char *strerror( int errnum );

헤더 : stdio.h

기능 : errnum에 해당하는 에러메시지 문자열을 만든다. 에러메시지 문자열은 모두 \n으로 끝나므로 개행 문자를 첨가해 줄 필요는 없다.( 에러 메시지는 이미 정의되어 있으므로 궁금하면 출력시켜보자)

리턴 : 에러메시지 문자열의 포인터

 

 stricmp

원형 : int stricmp( const char *src1, const char *src2 );

헤더 : string.h

기능 : 두 개의 문자열을 대소 비교함. 하지만 대소문자를 구분하지 않는다. 이 함수를 사용하여 두 개의 문자열이 같은 문자열인지 아닌지를 비교할 수 있다. 같을 경우 0, 다를 경우 양수나 음수의 값을 리턴이 함수를 매크로로 정의해 둔 함수가 strcmpi 이다.

리턴 : src1 < src2  인 경우 음수 리턴

         src1 = src2  인 경우 0 리턴

         src1 > src2  인 경우 양수 리턴

 

 strlen

원형 : size_t strlen( const char *src );

헤더 : string.h

기능 : 문자열 src 의 길이를 계산한다. 널문자는 길이에 포함되지 않고 널문자 앞에 까지 문자 개수를 리턴한다.

리턴 : 문자열의 길이

 

 strlwr

원형 : char *strlwr(char *src);

헤더 : string.h

기능 : 문자열 src 내의 대문자(A~Z)를 소문자(a~z)로 변경한다. 영문자 외의 다른 문자는 변경하지 않는다.

리턴 : 인수로 주어진 src를 그대로 리턴

 

 strncat

원형 : char *strncat( char *dest, const char *src, size_t maxlen );

헤더 : string.h

기능 : dest 의 널문자에 src의 문자열을 붙이는데 maxlen 길이 만큼만 붙인다.

리턴 : dest의 번지를 리턴

 

 strncmp

원형 : int strncmp( const char *src1, const char *src2, size_t maxlen );

헤더 : string.h

기능 : 두 개의 문자열을 대소 비교한다. 비교시 대소문자를 구분한다. 하지만 문자열 전체를 비교하는 것이 아니라 maxlen 길이 만큼만 비교한다.

리턴 : src1 < src2  인 경우 음수 리턴

         src1 = src2  인 경우 0 리턴

         src1 > src2  인 경우 양수 리턴

 

 strncmpi

원형 : int strncmpi( const char *src1, const char *src2, size_t maxlen );

헤더 : string.h

기능 : 두 개의 문자열을 대소 비교한다. 비교시 대소문자를 구분하지 않는다하지만 문자열 전체를 비교하는 것이 아니라 maxlen 길이 만큼만 비교한다.

리턴 : src1 < src2  인 경우 음수 리턴

         src1 = src2  인 경우 0 리턴

         src1 > src2  인 경우 양수 리턴

 

 strncpy

원형 : char *strncpy( char *dest, char *src, size_t maxlen );

헤더 : string.h

기능 : 문자열을 정해진 길이만큼 복사한다. 길이만큼만 복사하기 때문에 dest의 뒤에 널문자가 붙지 않는다.

리턴 : dest의 번지를 리턴

 

 strnicmp

원형 : int strnicmp( const char *src1, const char *src2, size_t maxlen );

헤더 : string.h

기능 : 두 개의 문자열을 대소 비교한다. 비교시 대소문자를 구분하지 않는다하지만 문자열 전체를 비교하는 것이 아니라 maxlen 길이 만큼만 비교한다. 이 함수의 매크로 버젼이 strncmpi 이다.

리턴 : src1 < src2  인 경우 음수 리턴

         src1 = src2  인 경우 0 리턴

         src1 > src2  인 경우 양수 리턴

 

 strset

원형 : char *strset( char *src, int c );

헤더 : string.h

기능 : 문자열을 특정 문자로 채운다. 문자열 중 널문자가 발견될 때가지 문자 c 로 채운다.

리턴 : src의 번지를 리턴

 

 strpbrk

원형 : char *strpbrk( const char *src1, const char *src2 );

헤더 : string.h

기능 : 문자열 src1 내에 문자열 src2에 있는 문자 중의 하나라도 있는지 검사하고 있을 경우 그 포인터를 리턴.

리턴 : 문자열 src1 내에 문자열 src2에 있는 문자 중 하나가 발견된 포인터를 리턴. 없을 경우 널을 리턴

 

 strrchr

원형 : char *strrchr( const cjar *src, int c );

헤더 : string.h

기능 : 문자 배열 src내에 문자 c가 있는지 검사하고 있을 경우 문자 c가 있는 번지를 리턴한다. 하지만 앞에서 부터 검사하는 것이 아니라 뒤에서 부터 검사를 진행한다.

리턴 : 문자열 src에서 발견된 문자 c의 포인터를 리턴. 발견되지 않을 경우 널을 리턴.

 

 strrev

원형 : char *strrev( char *src );

헤더 : string.h

기능 : 문자열의 순서를 바꾼다. 즉 제일 앞에 있는 문자가 제일 뒤로 가고 제일 뒤의 문자가 제일 처음으로 옮겨진다. 널문자는 이동 없음.

리턴 : 역순으로 바꾼 문자열의 src번지

 

 strspn

원형 : size_t strspn( const char *src1, const char *src2 );

헤더 : string.h

기능 : 문자열 src1 중에서 문자열 src2에 있는 문자들이 연속해 있는 길이를 구한다.

예를 들어 src1 = "12345678" 이고 src2 = "143290" 이라면 src1에서 src2의 문자들을 찾아보면 1234가 있다. 이 문자열의 길이 4를 리턴한다.

리턴 : 찾아낸 세그먼트의 길이를 리턴. 만약 0을 리턴하면 세그먼트를 찾지 못한 것이다.

 

 strstr

원형 : char *strstr( const char *src1, const char *src2 );

헤더 : string.h

기능 : 문자열 src1내에서 문자열 src2가 포함되어 있는지 검사하고 있다면 src2와 같은 문자열이 있는 부분을 리턴한다.

리턴 : 부분문자열의 선두 번지. 없다면 널을 리턴

 

 strtod

원형 : double strtod( const char *src1, char **endptr );

헤더 : stdlib.h

기능 : 문자열을 double 형 부동 소수점으로 바꾼다. 문자열은 다음과 같은 구조로 이루어져야 한다.

[공백,][부호][숫자][소수점][e]  -> ex) -5.64e+5, -3.6924

순서를 어기거나 불필요한 문자가 중간에 있을 경우는 변환이 중지.

endptr 인수는 변환이 중지될 경우 중지된 문자를 가리키므로 에러 검색에 사용

리턴 : 변환된 double 형 실수를 리턴. overflow 발생시 HUGE_VAL을 리턴

 

 strtok

원형 : char *strtok( char *src1, char *src2 );

헤더 : string.h

기능 : 문자열에서 token을 찾아낸다. ( token 이란 특정한 구분자로 분리되는 문장 구성 요소이다. 구분자가

"/"라 할때 다음 문자열은 1994 Feb 20의 세 개의 token 으로 분리된다. "1994/Feb/20" )

문자열 src1 token을 찾아낼 문자열이며 src2 token 구분자가 들어있는 문자열이다. token 구분자는 여러개가 복수 개 지정될 수 있으며 token 구분자는 strtok 호출 시 마다 바뀔 수 있다.

리턴 : 찾아낸 token의 포인터를 리턴. token이 더 이상 없을 경우 널 리턴.

( 이해가 안가는 분은 winapi에서 예제를 참고)

 

strtol

원형 : long strtol( const char *src1, char **endptr, int radix );

헤더 : stdlib.h

기능 : 문자열을 long 형 정수로 변환한다.문자열 src1은 다음과 같은 구조로 이루어져야 한다.

[공백, ][부호][숫자]

만약 이 순서를 어기거나 불필요한 문자가 문자열 내에 있을 경우 변환은 중지되고 중지된 위치가 endptr에 설정된다. endptr은 에러 검색에 사용하면 용이. 그리고 radix은 문자열을 해석할 진법을 지정할 때 사용되는데 범위는 2~36 까지 이고 그 진법에서 사용되는 문자만 인식

리턴 : 변환된 long 형 정수를 리턴. 변환이 불가능할 경우 0을 리턴

 

strtoul

원형 : unsigned long strtoul(const char *src1, char **endptr, int radix );

헤더 : string.h

기능 : 문자열을 부호없는 long 형 정수로 바꾼다. 사용법은 strtol 과 동일.

리턴 : 변환된 unsigned long 형 정수를 리턴. 변환이 불가능할 경우 0을 리턴

 

strupr

원형 : char *strupr( char *src );

헤더 : string.h

기능 : 문자열 src내의 소문자 (a~z)를 대문자( A~Z)로 변환한다. 영문자 외의 다른 문자는 변경하지 않는다.

리턴 : src의 번지를 리턴

출처&참조 : www.winapi.co.kr

 

Posted by 두장
2008. 10. 31. 16:03

 

11.1 표준 입·출력 함수

표준 입·출력 함수는 자료의 기록, 판독에 대하여 다음과 같이 4가지 방법을 사용한다.

① 키보드로부터 자료를 읽어서 화면에 자료를 나타내는 방법으로 한 번에 한문자만을기록, 판독하는 방법

(예: getchar(), getc(), getch(),putchar(), putc(), putch())

② 키보드에서 문자열을 읽어서 화면에 문자열을 나타내주는 방법

(예: gets(), puts())

③ 문자, 문자열, 부동 소수점, 정수 등을 혼합하여 형식화된 자료를 기록하거나 판독하는 방법

(예: fscanf(), fprintf())

④ 레코드 또는 블록 형식을 이용하여 자료의 기록 및 판독을 행하는 방법 등이 있다.이중 2가지 방법은 이미 배운바 있으나 정리하면서     간략히 설명하고 3,4번째 방법에대해 자세히 기술한다.

단일 문자 입·출력

■ 입 력

키보드로부터 1문자를 입력하는 형식은 다음과 같다.

 

getchar()

getch()

getc(화일 포인터)

 

getchar(), getch(), getc() 함수의 사용 방법은 동일하나 getch() 함수는 화면에 문자가 나타나지 않으며 getc() 함수는 인수로서 읽고 쓸 화일의 이름을 꼭 밝혀 주어야 한다.

■ 출 력

1 문자를 화면에 출력하는 형식은 다음과 같다.

 

putchar()

putch()

putc(문자, 화일 포인터)

 

putchar(), putch(), putc() 함수의 사용 방법은 동일하나, putchar(), putch() 함수는 화면에서 출력만으로 사용하며 putc() 함수는 화일 포인터에 문자를 저장할 수 있다.

 

 [예제 11-1] putchar() 함수 사용 방법

 #include <stdio.h>

void main()

     {

         char ch;

         while((ch = getchar()) != '\r')

         putchar(ch);

     }

 TurboC example

TurboC example

 

 

[예제 11-2] putch() 함수 사용 방법  

#include <stdio.h>

void main()

    {

        char ch;

        while((ch = getch()) != '\r')

        putch(ch);

    }

TurboC example 

 

 

[예제 11-3] getc(), putc() 함수 사용 방법  

 #include <stdio.h>

void main()

     {

          char ch;

          while((ch = getc(stdin)) != '\r')

          putc(ch,stdout);

     }

TurboC example

TurboC example 

 

 

문자열의 입·출력

문자열의 입·출력에 대한 형식은 다음과 같다.

 

gets(문자열)

puts(문자열)

 

gets() 함수는 표준 입력 장치(스트림 입력 장치라고도 함)으로부터 문자열을 입력으로 받아들여 문자열에 대한 포인터를 반환하는 함수이다 이때 주의할 점은 문자열 버퍼의 끝에 NULL('\0')이 자동적으로 부가되어 저장되므로 입력의 문자 수보다 적어도 하나 이상의 저장공간이 확보되어야 한다. puts() 함수는 표준 출력 장치로 문자열을 보내는 함수이다. 이 함수는 printf()의 제어지시를 이용하여 문자열을 간단히 출력할 수 있으므로 잘 사용하지 않는다.

 

[예제 11-4]  

#include <stdio.h>

void main()

     {

          char string[80];

          printf("Input a string:");

          gets(string);

          puts(string);

     }  

Input a string:This is sample string

This is sample string 

 

 

11.2 화일의 개방과 종결

본 절에서는 보조 기억장치를 이용한 화일의 기록, 판독에 대한 초기 과정, 화일의 개방과 종결에 대해 기술한다.

화일의 개방

화일은 보조 기억장치에서 읽어오거나 보조 기억장치로 기억시키기 위해서는 화일을 개방하여야 한다. 화일을 개방하기 위해서는 화일이름을 읽을 것인지 기억 시킬것인지를 운영체제에 정보를 제공해 주어야 한다. 운영 체제는 보조 기억장치(주로 디스크 장치 이용)에서 정보를 읽을 것인지 또는 기억할 것인지에 대한 정보를 포인터로써 돌려주게 된다. 따라서 개방되는 화일은 구조체를 가지게 된다.

화일 구조체는 자료 버퍼의 현재 크기와 위치 등의 화일에 관한 정보를 포함하며 반드시 #include <stdio.h> 할 필요가 있다.

프로그램에서 화일 구조체에 대한 포인터형의 변수 선언과 화일을 개방하는 문장은 다음과 같다.

예)#include <stdio.h>

FILE *fp;

fp=fopen("kim.dat","w");

여기서 *fp는 포인터 화일 변수이며 fopen() 함수는 fp변수에 저장된 화일 구조체에 대한 포인터를 돌려준다. 개방 화일은 "kim.dat"이며 화일에 자료를 기록하라는 의미가 "w"이다.

<stdio.h> 화일에 미리 정의되어 개방되는 스트림은 다음과 같다.

 

이 름

장 치

모 드

stdin

stdout

stderr

stdaux

stdprn

표준 입력 장치(키보드)

표준 출력 장치(화면)

표준 에러 장치(화면)

표준 보조 장치(직렬 포트)

표준 출력 장치(병렬 프린터)

텍스트 모드

텍스트 모드

텍스트 모드

2 진 모드

2 진 모드

 

FILE 구조체에 대한 포인터형의 변수와 화일의 개방함수 fopen()에 대해 생각해 보자. fopen() 함수의 목적은 입·출력 동작을 하기 위해 화일을 개방하는데 사용되며 형식은 다음과 같다.

 

FILE *fopen(화일명, 접근 모드)

 

여기서 접근 모드는 개방하고자 하는 화일의 모드를 결정하는 문자열을 말하며 다음과 같은 사용 모드를 제공하고 있다.

 

분 류

접근 모드

접근 내용

읽 기

r

읽기 전용으로 기존의 화일을 개방

쓰 기

w

a

쓰기 전용으로 새로운 화일을 생성

추가로 쓰기 위해 화일을 개방

갱 신

r+

w+

a+

갱신을 위해 기존의 화일을 개방

갱신을 위해 새로운 화일을 생성

갱신을 위해 화일의 끝에 개방

2진 모드

"rb", "wb", "ab"

"r+b" 또는 "rb+"

"r+a" 또는 "ra+"

2진 화일에 대해 r,w,a 기능 수행

2진 화일에 대해 r+ 기능 수행

2진 화일에 대해 a+ 기능 수행

 

화일 닫기 화일을 개방하여 그 화일에 대한 기록과 판독이 끝나면 그 화일을 닫아야만 한다. 화일을 닫는 형식은 다음과 같다.

 

fclose(화일 포인터)

11.3 화일 입·출력 함수

이 절에서는 화일의 기록과 판독에 따른 입·출력 형식에 대해 기술한다.

문자 단위 화일 입·출력 함수

일단 화일을 개방하면 디스크에 기록시키거나 디스크에서 화일의 내용을 읽어올 수가 있다. 문자 단위 화일 입·출력 형식은 다음과 같다.

 

fgetc(화일 포인터)

fputc(문자, 화일 포인터)

 

 

[예제 11-5] fputc() 함수를 이용하여 화일에 출력하는 프로그램  

 #include <stdio.h>

void main()

     {

          FILE *fp;

          char ch;

          fp=fopen("kim.dat","w");

          while((ch=getch()) != '\r') {

               putch(ch);

               fputc(ch,fp);

          }

          fclose(fp);

     }

"kim.dat"화일에는 키보드를 통해서 입력된 문자가 저장된다. 

 

 

[예제 11-6] fgetc() 함수를 이용하여 화일에 있는 내용을 화면에 출력하는 프로그램  

#include <stdio.h>

void main(void)

     {

          FILE *fp;

          char string[] = "This is a test";

          char ch;

          if((fp=fopen("kim.dat", "r")) == NULL) {

               printf("\n File not found");

               exit(-1);

          }

          do

          {

               ch = fgetc(fp);

               putch(ch);

          } while (ch != EOF);

          fclose(fp);

     }

"kim.dat" 화일에 있는 내용이 화면에 출력된다.

만약 "kim.dat"라는 화일이 없으면

"File not found" 라는 메시지가 출력된다.

  

 

  문자열의 화일 입·출력 함수

화일에서 문자열을 판독하거나 화일 문자열을 기록하는 형식은 다음과 같다.

 

fgets(문자열, 최대 길이, 화일 포인터)

fputs(문자열, 최대 길이 화일 포인터)

 

fgets() 함수는 화일 포인터로부터 입력행을 읽어 문자 배열에 저장하고 현재 위치로부터 한 레코드 또는 (최대 길이-1)개의 문자가 읽혀지면 개행문자를 만나면 끝낸다. 마지막 문자가 정상적으로 읽혀지면 NULL('\n')을 추가시키며 화일의 끝이거나 에러이면 NULL을 반환한다.

fputs() 함수는 화일 포인터가 지시하는 화일에 문자열을 기록하라는 것을 의미하며 정상이면 0을 화일의 끝이거나 에러이면 EOF(-1)을 반환한다.

 

[예제 11-7] fgets(), fputs() 함수 사용 방법  

#include <stdio.h>

void main()

     {

          FILE *fp,*fp1;

          char string[30];

          fp=fopen("kim1.dat","w");

          fp1=fopen("kim.dat","r");

          while(fgets(string,30,fp1) != NULL)

          fputs(string,fp);

          fclose(fp);

          fclose(fp1);

}

c:>type kim.dat

Jim Botton, sportscaster and author of Ball Four, on

the reception to his book : "Pete rose would screen at

me from dugout because I resealed too much. Now he's

posing in magazine ads in his underwear.

   

 

 

"kim1.dat" 화일에는 "kim.dat"화일에 있는 내용과 동일하다.

형식화된 화일 입·출력 함수

지금가지 문자와 텍스트를 화일에 기록하거나 판독하는 것을 다루었다. 여기서는 수치 자료를 다루기 위해서 형식화된 입·출력 함수에 대해 설명한다. 형식화된 입·출력 함수에 대한 다음과 같다.

 

fscanf(화일 포인터, 제어문자열, 인수)

fprintf(화일 포인터, 제어문자열, 인수)

 

fscanf() 함수fprinf() 함수는 화일 포인터를 제외하고는 scanf() 함수와 fprintf() 함수와 동일하다. fscanf() 함수는 화일로 부터 지정된 형태로 읽어들여 뒤에 오는 인수에 대입하고 화일의 끝이거나 에러가 발생하면 EOF를 반환하고 그렇지 않을 경우에는 입력된 항목의 수 를 반환한다.

fprintf() 함수는 지정된 형태를 화일에 출력하고 화일에 쓰여진 문자의 수를 반환하고 에러가 생길 경우에는 음수(-)의 값을 반환한다.

 

[예제 11-8] 성적을 저장하는 프로그램  

#include <stdio.h>

void main()

     {

          FILE *fp;

          char name[20];

          int number;

          int kor;

          int eng;

          int math;

          int total;

          int i=0;

          fp=fopen("grade.dat","w");

          do {

               printf("Enter name, number, Kor, Eng, Math : ");

               scanf("%s %d %d %d %d",name, &number, &kor, &eng,                          &math);

               total=kor+eng+math;

               fprintf(fp,"\n%s %d %d %d %d %d",name, number, kor, eng,

                         math, total);

               i++;

          } while(i <4);

          fclose(fp);

     }

Enter name, number, Kor, Eng, Math : kim 1 57 87 45

Enter name, number, Kor, Eng, Math : kim1 2 67 45 76

Enter name, number, Kor, Eng, Math : kim2 3 76 45 95

Enter name, number, Kor, Eng, Math : kim3 4 67 45 87

c:>type grade.dat

kim 1 57 87 45 189

kim1 2 67 45 76 188

kim2 3 76 45 95 216

kim3 4 67 45 87 199 

 

 

[예제 11-9] 성적이 있는 화일을 읽어서 화면에 출력하는 프로그램  

 #include <stdio.h>

void main()

     {

          FILE *fp;

          char filename[15];

          char name[20];

          int number;

          int kor;

          int eng;

          int math;

          int total;

          printf("Enter name of a file to open foe WRITING : ");

          gets(filename);

          if((fp=fopen(filename,"r")) == NULL) {

               printf("\n File not found");

               exit(-1);

          }

          printf("\n Name Number KOR ENG MATH TOTAL");

          do {

               fscanf(fp,"%s %d %d %d %d %d",name, &number, &kor,

                         &eng, &math, \&total);

               printf("\n %-10s%3d %3d %3d %3d %3d", name, number, kor,                          eng, math,total);

          } while(!feof(fp));

          fclose(fp);

     }

Enter name of a file to open foe WRITING : grade.dat

Name Number KOR ENG MATH TOTAL

kim 1 57 87 45 189

kim1 2 67 45 76 188

kim2 3 76 45 67 216

kim3 4 67 45 87 199 

 

 만일 "grade.dat"라는 화일이 없으면 "File not found"라는 메시지가 출력된다.

레코드 단위의 화일 입·출력 함수

형식화된 화일 입·출력 함수는 각 숫자가 문자로서 저장되기 때문에 디스크의 공간을 많이 차지하게 된다.

또한 배열이나 구조체 같은 복잡한 자료 형을 읽거나 기록할 때 직접적인 방법이 없다.

배열을 한 번에 배열 요소 하나를 저장하기 때문에 비 효율적이며 구조체는 여러 부분으로 나누어서 저장해야 한다.

이러한 문제점을 해결하는 것이 레코드 단위의 입·출력이다. 레코드 단위의 입·출력은 수치를 정수형은 2바이트,

실수형은(부동 소수점형)은 4바이트를 2진 형식으로 쓰기 때문에 메모리를 효율적으로 이용할 수가 있다.

한꺼번에 많은 자료를 취급할 수가 있으며 배열, 구조체, 배열의 구조체, 그리고 다른 자료 구조를 단일 문장으로 사용할 수가 있다.

형식은 다음과 같다.

 

fwrite(문자열, 크기, 항목수, 화일 포인터)

fread(문자열, 크기, 항목수, 화일 포인터)

 

fwrite() 함수는 지정된 갯수 만큼의 자료를 화일에 저장하며 fread() 함수는 주어진 화일 로부터 지정된 갯수만큼의 자료를 읽어서 문자열에 저장한다.

 

[예제 11-10] fwrite() 함수를 이용한 프로그램  

#include <stdio.h>

void main()

     {

          struct {

               char name[20];

               int number;

               float height;

          } man;

          FILE *fp;

          float dummy=0.0;

          if((fp=fopen("kim.dat","wb")) == NULL) {

               printf("\n File not found");

               exit(-1);

          }

          do {

               printf("\n Enter name : ");

               gets(man.name);

               printf(" Enter number : ");

               scanf("%d",&man.number);

               printf(" Enter height : ");

               scanf("%f",&man.height);

               fflush(stdin);

               fwrite(&man, sizeof(man),1,fp);

               printf("Add another man(y/n) ?");

          } while(getch() == 'y');

          fclose(fp);

     }

Enter name : kim1

Enter number : 1

Enter height : 34.83

Add another man(y/n) ?

Enter name : kim2

Enter number : 2

Enter height : 67.56

Add another man(y/n) ? y

Enter name : kim3

Enter number : 3

Enter height : 84.54

Add another man(y/n) ? n 

 

 

[예제 11-11] fread() 함수을 이용한프로그램  

#include <stdio.h>

#include <stdlib.h>

void main()

     {

          struct {

               char name[20];

               int number;

               float height;

          } man;

          FILE *fp;

          fp=fopen("kim.dat","rb");

          while(1) {

               fread(&man, sizeof(man), 1, fp);

               if(feof(fp)) {

                    fclose(fp);

                    exit(-1);

               }

               printf("\n Name : %s", man.name);

               printf("\n Numer : %d", man.number);

               printf("\n Height : %4.2f",man.height);

           };

     }

Name : kim1

Number : 1

height : 34.83

Name : kim2

Number :2

height : 67.56

Name : kim3

Number : 3

height : 84.54  

 

 여기서 feof() 함수는 화일의 끝을 검사하는 함수이며 화일 포인터가 가리키고 있는 화일이 모두다 판독되면 ZERO(0)가 아닌 값을 반환하고 그렇지 않으면 0을 반환한다.

exit(n) 함수는 프로그램의 실행중 중도에 끝내고 싶을 때 이용되는 함수이며 n은 0이 아니어야 프로그램의 수행을 종료하는 함수이다.

화일 포인터의 제어 함수

이제가지의 순차화일에 비해 다소 조작 방법이 복잡하지만 어디서든지 읽고 쓰기 가능한 방식은 "랜덤화일처리"라고 하며, 랜덤화일처리에서 어느 부분을 읽을 것인지를 지정할 수 있는데 이를 수행하는 함수가 fseek() 이다.

fseek() 함수는 화일의 위치를 자유로이 지정하는 함수로서 다음과 같은 형식을 갖는다.

 

fssek(화일 포인터, 변위, 기준 점)

 

화일 포인터의 화일 위치를 기준점을 기준으로 하여 변위 바이트만큼 이동하여 정상시는 0, 오류시는 0 이외의 값을 반환한다.

이때 기준점의 위치 설정에 따라 3가지로 나누며 이에 대한 상수 및 의미는 표 11-3과 같다.

 

상 수

실 제 값

의 미

SEEK_SET

SEEK_CUR

SEEK_END

0

1

2

화일의 처음

현재 화일 포인터의 위치

화일끝 검출 위치

 

한 편 fseek() 이외의 랜덤 처리계 함수 및 기능은 표 11-4와 같은 종류가 있다.

 

함수명

기 능

fflush

fgetpos

fsetpos

ftell

rewind

버퍼에 넣으려는 전체의 문자를 화일에 씀

화일 위치의 정보를 읽음

화일 포인터의 위치 설정

현제의 화일 위치 파악

화일의 위치를 선두로 이동

 

 

[예제 11-12] fseek() 함수를 사용한 프로그램  

#include <stdio.h>

#include <stdlib.h>

void main()

     {

          struct {

               char name[20];

               int number;

               float height;

          } man;

          FILE *fp;

          int rec_no;

          long int offset;

          fp=fopen("kim.dat","rb");

          printf("Enter record number : ");

          scanf("%d",&rec_no);

          offset=(rec_no-1) * sizeof(man);

          if(fseek(fp,offset,SEEK_SET)) {

               printf("\n Can't move pointer there.");

               exit(-1);

          }

          fread(&man, sizeof(man), 1, fp);

          printf("\n Name : %s", man.name);

          printf("\n Numer : %d", man.number);

          printf("\n height : %f",man.height);

          fclose(fp);

      }

Enter record number : 2

Name : kim2

Numer : 2

height : 67.55998 

 

 

11.4 메모리 할당

지금까지 다루어온 자료의 저장 방법은 표준 변수들을 사용하여 기억 장소를 미리 확보하여 확보된 영역에서의 자료의 저장 방법을 다루었다.

예를 들어 배열 선언에서 100개의 원소를 취하는 배열을 확보하고 5개의 원소만을 취한다면 95개의 원소는 빈 공간으로 남아 기억 공간이 낭비가 된다.

이 절에서는 자료의 크기가 동적으로 변할때 메모리의 확대가 가능한 메모리 할당 에 대하여 기술한다. c언어에서는 malloc() 함수를 제공하여 처리하고 있다. malloc() 함수의 사용 형식은 다음과 같다.

 

malloc(arg)

 

여기서 arg는 메모리의 바이트를 표시하는 양의 정수이며 새로운 메모리의 블럭 시작점에 대한 포인터를 반환한다.

 

[예제 11-12] malloc() 함수를 이용한 프로그램  

#include <string.h>

#include <stdio.h>

void main()

     {

          char temp_string;

          temp_string=(cahr *) malloc(100);

          strcpy(temp_string,"Hello Kang");

          printf("Enter string : ");

          fgets(temp_string,100,stdin);

          printf("Your input string is %s",temp_string);

     }

Hello Kang

Enter string : Good morning !

Your input string is Good morning !

 

 

다음 표 11.5는 표준 입·출력 함수에 대하여 총괄적인 의미를 보인 것이다.

 

함 수 명

형 식

의 미

getc(fp)

getc(fp)

FILE *fp;

fp가 가르키는 화일로부터 한 문자 입력

putc(c,fp)

putc(c,fp)

int c;

FILE *fp;

fp가 가르키는 화일로 한 문자 출력

fgetc(fp)

fgetc(c)

int c;

fp가 가르키는 화일로부터 한 문자 입력

fputc(c,fp)

fputc(c,fp)

int c;

FILE *fp;

fp가 가르키는 화일로 한 문자 출력

fgtes(s,n,fp)

fgtes(s,n,fp)

char *s;

int n;

FILE *fp;

화일 fp에 최대 n바이트의 문자열 s를 입력

fputs(s,fp)

fputs(s,fp)

char *s;

FILE *fp;

화일 fp에 문자열 s를 출력

fprintf(fp,format,인수)

fprints(fp,format,인수)

FILE *fp;

char *format;

화일 fp에 지정된 형태 format에 따라 출력

fscanf(fp,format,인수)

fscanf(fp,format,인수)

FILE *fp;

char *format;

화일 fp에서 지정된 형태 format에 따라 입력

fread(s,n,item,fp)

fread(s,n,item,fp)

char *s;

int n;

int item;

FILE *fp;

화일 fp에서 지정된 갯수 만큼의 데이타를 읽어 문자 열 s에 입력

 

 

연 습 문 제

 

[문제 11-1] 화일을 읽어서 대문자는 소문자로 소문자는 대문자로 변환하는 프로그램  

#include <stdio.h>

void main()

     {

          int ch;

          FILE *fp, *fp;

          char filename1[13], filename2[13];

          printf("\n Input filename : ");

          gets(filename1);

          fp=fopen(filename1,"r");

          printf(" Output filename : ");

          gets(filename2);

          fp1=fopen(filename2,"w");

          while((ch=fgetc(fp)) != EOF) {

               if(ch >= 'A' &&ch <='Z')

                    fputc(ch + 32, fp1);

               else if(ch >= 'a' &&ch <='z')

                    fputc(ch-32,fp1);

               else

                    fputc(ch,fp1);

          }

     }

Input filename : in_letter.dat

Output filename : out_letter.dat

c:>type in_letter.dat

Jim Botton, sportscaster and author of Ball Four, on

the reception to his book : "Pete rose would screan at

me from dugout because I recealed too much. Now he's

posing in magazine ads in his underwear.

c:>type out_letter.dat

jIM bOTTON, SPORTSCASTER AND AUTHOR OF bALL fOUR, ON

THE RECEPTION TO HIS BOOK : "pETE ROSE WOULD SCREAN AT

ME FROM DUGOUT BECAUSE i RECEALED TOO MUCH. nOW HE'S

POSING IN MAGAZINE ADS IN HIS UNDERWEAR.

 

 

 

[학습 11-1]  

#include <stdio.h>

void main()

     {

          int ch;

          int i=0;

          char string[100];

          printf("\n Input string : ");

          gets(string);

          do {

               ch=string[i];

               if(ch >= 'A' &&ch <='Z')

                    putchar(ch + 32);

               else if(ch >= 'a' &&ch <='z')

                    putchar(ch-32);

               else

                    putchar(ch);

               i++;

           } while(string[i] != '\0');

     }

Input String : This is Sample Text

tHIS IS sAMPLE tEXT  

 

 

[문제 11-2] 레코드 단위 입·출력 함수를 이용하여 봉급을 계산하는 프로그램  

#include <stdio.h>

#include <string.h>

struct{

     char depart[4];

     char name[20];

     int day;

     float pay;

}work_pay;

void main()

     {

          char numstr[20], flag;

          float money=30000;

          FILE *fp;

          if((fp=fopen("work_pay.rec","ab"))==NULL)

          fp=fopen("work_pay.rec","wb");

          do{

               printf("\nEnter department : ");

               gets(work_pay.depart);

               printf("Enter name : ");

               gets(work_pay.name);

               printf("Enter How much day : ");

               gets(numstr);

               work_pay.day=atoi(numstr);

               work_pay.pay=money * (float)work_pay.day;

               printf("\nPayment per day : %f",money);

               printf("\nTotal Payment:%f",work_pay.pay);

               fwrite(&work_pay,sizeof(work_pay),1,fp);

               printf("\n\nContinue (Y/N)...");

               flag=getche();

          }while(flag != 'N' &&flag != 'n');

          fclose(fp);

     }

Enter department : 3

Enter name : Kang jae sik

Enter how much day : 34

 

Payment per day : 30000.00000

Total Payment : 1020000.00000

Continue (Y/N)...

결과는 "work_pay.rec"라는 화일에 2진 정보로 저장된다.

 

 

[문제 11-3] 화일에 있는 문자의 수를 출력  

 #include <stdio.h>

#include <string.h>

void main(int argc, char *argv[])

     {

          FILE *fp;

          char string[81];

          char filename[13];

          int count=0;

          strcpy(filename,argv[1]);

          if(argc != 2) {

               printf("\n Input filename : ");

               gets(filename);

          }

          if((fp=fopen(filename,"r")) == NULL) {

               printf("\n File not found");

               exit(-1);

          }

          while(getc(fp) != EOF)

          count++;

          printf("\n File <%s >contains %d characters",filename,count);

          fclose(fp);

     }

 Input file name : exam.dat

File <exam.dat >contains 444 characters

 

 

[문제 11-4] 임의의 화일을 읽어서 행을 두 배로 확장하는 프로그램  

#include <stdio.h>

#include <string.h>

void main(int argc, char *argv[])

     {

          FILE *in_fp, *out_fp;

          char in_filename[13], out_filename[13];

          strcpy(in_filename,argv[1]);

          strcpy(out_filename,argv[2]);

          if(argc <3) {

               printf("\n Input filename : ");

               gets(in_filename);

               printf(" Output filename : ");

               gets(out_filename);

          }

          in_fp=fopen(in_filename,"r");

          out_fp=fopen(out_filename,"w");

          double_space(in_fp, out_fp);

          fclose(in_fp);

          fclose(out_fp);

     }

double_space(in_p, out_p)

FILE *in_p, *out_p;

     {

          int c;

          while((c=getc(in_p)) != EOF) {

               putc(c,out_p);

               if(c == '\n')

                    putc('\n',out_p);

          }

     }

 Input filename : in.dat

Output filename : out.dat

c:>type in.dat

This is

a

sample

file

c:>type out.dat

This is

a

sample

file 

 

 

[학습 11-2] 화일의 개행문자를 무시하여 화일의 내용을 한 줄로 길게 늘리는 프로그램  

#include <stdio.h>

#include <string.h>

void main(int argc, char *argv[])

     {

          FILE *in_fp, *out_fp;

          char in_filename[13], out_filename[13];

          strcpy(in_filename,argv[1]);

          strcpy(out_filename,argv[2]);

          if(argc <3) {

               printf("\n Input filename : ");

               gets(in_filename);

               printf(" Output filename : ");

               gets(out_filename);

          }

          in_fp=fopen(in_filename,"r");

          out_fp=fopen(out_filename,"w");

          double_space(in_fp, out_fp);

          fclose(in_fp);

          fclose(out_fp);

     }

double_space(in_p, out_p)

FILE *in_p, *out_p;

     {

          int c;

          while((c=getc(in_p)) != EOF) {

               if(c == '\n')

                    putc(' ',out_p);

               else

                    putc(c,out_p);

          }

     }

Input filename : in.dat

Output filename : out.dat

c:>type in.dat

This is

a

sample

file

c:>type out.dat

This is a sample file  

 

 

[문제 11-5] 화일에 'A'부터 'Z'까지의 문자를 저장하고 해당 위치에 있는 문자를 출력  

 #include <stdio.h>

void main()

     {

          FILE *fp;

          int ch;

          int num;

          char filename[13];

          printf("\n Input file name : ");

          gets(filename);

          fp=fopen(filename,"w");

          for(ch='A'; ch<='Z'; ch++)

          putc(ch, fp);

          fclose(fp);

          if((fp=fopen(filename,"r")) == NULL) {

               printf("\n File not found");

               exit(-1);

          }

          printf(" Record Number = ");

          scanf("%d",&num);

          if(fseek(fp,num-1,0) != 0) {

               perror("Can't move pointer there.");

               exit(-1);

          }

          ch=getc(fp);

          printf("\n Record Number : %d character = %c",num,ch);

          fclose(fp);

     }

 Input file name : in.dat

Record number : 5

Record number : 5 character = e

c:>type in.dat

ABCDEFGHIJKLMNOPQRSTUVWXYZ

 

 

[문제 11-6] 화일을 복사하는 프로그램  

#include <stdio.h>

#include <string.h>

void main(int argc, char *argv[])

     {

          FILE *in_fp, *out_fp;

          char in_filename[13], out_filename[13];

          char ch;

          strcpy(in_filename, argv[1]);

          strcpy(out_filename, argv[2]);

          if(argc <3) {

               printf("\n Input file name : ");

               gets(in_filename);

               printf(" Output file name : ");

               gets(out_filename);

          }

          if((in_fp=fopen(in_filename,"r")) == NULL) {

               printf("\n %s file not found");

               exit(-1);

          }

          out_fp=fopen(out_filename,"w");

          while((ch=getc(in_fp)) != EOF)

          putc(ch, out_fp);

          fclose(in_fp);

          fclose(out_fp);

     }

Input file name : letter.dat

Output file name : letter.bak

c:>type letter.dat

Jim Botton, sportscaster and author of Ball Four, on

the reception to his book : "Pete rose would screan at

me from dugout because I recealed too much. Now he's

posing in magazine ads in his underwear.

c:>type letter.bak

Jim Botton, sportscaster and author of Ball Four, on

the reception to his book : "Pete rose would screan at

me from dugout because I recealed too much. Now he's

posing in magazine ads in his underwear.

  

 

 

[학습 11-3] 두 개의 화일을 합병하는 프로그램  

 #include <stdio.h>

#include <string.h>

#define MAX_LINE 80

void main(int argc, char *argv[])

     {

          FILE *in_fp[2], *out_fp;

          int i;

          char ch;

          char temp[MAX_LINE];

          char *in_filename[2],

          out_filename[13];

          strcpy(in_filename[0],argv[1]);

          strcpy(in_filename[1],argv[2]);

          if(argc <3) {

               for(i=0; i<2; i++) {

                    printf("Input %d-st file name : ",i+1);

                    scanf("%s",in_filename[i]);

               }

          }

          for(i=0; i<=1; i++)

          if((in_fp[i]=fopen(in_filename[i],"r")) == NULL) {

               printf("\n %s file not found",in_filename[i]);

               exit(-1);

          }

          printf("\nMerge file name : ");

          scanf("%s",out_filename);

          out_fp=fopen(out_filename,"w");

          for(i=0; i<2; i++) {

               while((ch=getc(in_fp[i])) != EOF)

               putc(ch,out_fp);

          }

          fclose(in_fp[0]);

          fclose(in_fp[1]);

          fclose(out_fp);

     }

Input 1-st file name : in1.dat

Input 2-st file nsme : in2.dat

Merge file name : out.dat

c:>type in1.dat

Jim Botton, sportscaster and author of Ball Four, on

the reception to his book : "Pete rose would screan at

c:>type in2.dat

me from dugout because I recealed too much. Now he's

posing in magazine ads in his underwear.

c:>type out.dat

Jim Botton, sportscaster and author of Ball Four, on

the reception to his book : "Pete rose would screan at

me from dugout because I recealed too much. Now he's

posing in magazine ads in his underwear. 

 

 

[문제 11-7] 화일을 dump하는 프로그램  

#include <stdio.h>

#include <string.h>

void main(int argc, char *argv[])

     {

          FILE *fp;

          int i;

          char ch;

          char buffer[17];

          char filename[13];

          strcpy(filename,argv[1]);

          if(argc <2) {

               printf("\nInput file name : ");

               scanf("%s",filename);

          }

          if((fp=fopen(filename,"r")) == NULL) {

               printf("\n %d file not found",filename);

               exit(-1);

          }

          do {

               for(i=0; i<16; i++) {

                    ch=getc(fp);

                    if(ch == EOF)

                         exit(1);

                    if(ch <31)

                         ch='.';

                    buffer[i]=ch;

                    printf("%3X",ch);

               }

               buffer[i]='\0';

               printf(" %s",buffer);

               putchar('\n');

          } while(1);

          fclose(fp);

     }

Input file name : letter.dat

20 20 20 4A 69 6D 20 42 6F 74 74 6F 6E 2C 20 73 Jim Botton, s

70 6F 72 74 73 63 61 73 74 65 72 20 61 6E 64 20 portscaster and

61 75 74 68 6F 72 20 6F 66 20 42 61 6C 6C 20 46 author of Ball F

6F 75 72 2C 20 6F 6E 2E 20 74 68 65 20 72 65 63 our, on. the rec

65 70 74 69 6F 6E 20 74 6F 20 68 69 73 20 62 6F eption to his bo

6F 6B 20 3A 20 22 50 65 74 65 20 72 6F 73 65 20 ok : "Pete rose

77 6F 75 6C 64 20 73 63 72 65 61 6E 20 61 74 2E would screan at.

20 6D 65 20 66 72 6F 6D 20 64 75 67 6F 75 74 20 me from dugout

62 65 63 61 75 73 65 20 20 49 20 72 65 63 65 61 because I recea

6C 65 64 20 74 6F 6F 20 6D 75 63 68 2E 20 4E 6F led too much. No

77 20 68 65 27 73 2E 20 70 6F 73 69 6E 67 20 69 w he's. posing i

6E 20 6D 61 67 61 7A 69 6E 65 20 61 64 73 20 69 n magazine ads i

6E 20 68 69 73 20 75 6E 64 65 72 77 65 61 72 2E n his underwear.

2E 2E  

 

 

[문제 11-8] sin함수를 화일에 출력하는 프로그램  

#include <stdio.h>

#include <math.h>

void main()

     {

          FILE *fp;

          char filename[13];

          int num,i;

          float x;

          printf("\nOutput file name : ");

          scanf("%s",filename);

          fp=fopen(filename,"w");

          num=16;

          fprintf(fp,"%d",num);

          for(i=0; i<num; i++) {

               x=sin(2*M_PI/num*i);

               fprintf(fp,"\n%f",x);

          }

     }

Output file name : sin.dat

16

0.000000

0.382683

0.707107

0.923880

1.000000

0.923880

0.707107

0.382683

0.000000

-0.382683

-0.707107

-0.923880

-1.000000

-0.923880

-0.707107

-0.382683  

 

 

[학습 11-4] 위에서 구한 화일을 그래프 형식으로 출력하기  

 #include <stdio.h>

#include <math.h>

#define MAX 100

void main()

     {

          int n;

          float x[MAX];

          file_io(&n,x);

          disp(n,x);

          sgraph(n,x);

     }

disp(int num,float array[])

     {

          int i;

          for(i=0; i<num; i++)

          printf("%d\t%f\n",i,array[i]);

     }

sgraph(int num, float array[])

     {

          int i,j,k=39;

          float fmax=0;

          for(i=0; i<num; i++) {

               if(fabs(array[i]>fmax))

               fmax=fabs(array[i]);

          }

          for(i=0; i<num; i++)

               array[i]/=fmax;

          printf("-1");string(k-2,' ');

          printf("0");string(k-2,' ');

          printf("+1\n");printf("+"); string(k-1,'-');

          printf("+"); string(k-1,'-');

          printf("+\n");

          for(i=0; i<num; i++) {

               j=array[i]*k + 0.5 + k;

               if(j>k) {string(k,' ');printf("+");

               string(j-k-1,'-');printf("*\n");

          }

          if(k==j) {

               string(k,' ');

               printf("*\n");

 

          }

          if(j<k) {

               string(j,' ');printf("*");

               string(k-j-1,'-');printf("+\n");

          }

     }

string(int x,char y)

     {

          if(x >0)

          while(x--)

          putchar(y);

     }

file_io(int *num,float array[])

     {

          FILE *fp;

          int i;

          char filename[13];

          printf("\nInput file name : ");

          scanf("%s",filename);

          if((fp=fopen(filename,"r")) == NULL) {

               printf("\n %s file not found",filename);

               exit(-1);

          }

          fscanf(fp,"%d",num);

          for(i=0; i<*num; i++)

          fscanf(fp,"%f",&array[i]);

     }

 Input file name : sin.dat

00.000000

10.382683

20.707107

30.923880

41.000000

50.923880

60.707107

70.382683

80.000000

9-0.382683

10-0.707107

11-0.923880

12-1.000000

13-0.923880

14-0.707107

15-0.382683

-1 0

+1

+--------------------------------------+--------------------------------------+

*

+--------------*

+---------------------------*

+-----------------------------------*

+--------------------------------------*

+-----------------------------------*

+---------------------------*

+--------------*

*

*--------------+

*---------------------------+

*-----------------------------------+

*--------------------------------------+

*-----------------------------------+

*---------------------------+

*--------------+

표 11.5 표준 입․출력 함수표 11.4 랜덤 처리계 함수표 11.3 기준점의 위치표 11.2 화일 접근 모드표 11.1 <stdio.h>화일의 개방 스트림

Posted by 두장
이전버튼 1 이전버튼