c 표준 라이브러리 함수 C 2012. 3. 30. 17:18

c 표준 라이브러리 함수

1. 데이터 변환 함수
2. 디렉토리 조작 함수
3. 버퍼 조작 함수
4. 파일 조작 함수
5. stream 입출력 함수
6. Low level 입출력 함수
7. Mathematics
8. 메모리 조작 함수
9. 탐색과 정렬 함수
10. 문자열 조작 함수
11. 시간 함수
12. 문자 분류 및 변환 함수
13. 기타 함수


1. 데이터 변환 함수

문자나 문자열을 수치 값으로 변환시키거나 대문자를 소문자로 소문자를 대문자로 변환하는 함수로 stdlib.h에 정의되어 있다.

헤더 파일 : #include

atof
형식 : double atof(char *string)
설명 : 문자열을 부동소수점 값으로 변환하는 함수 부동소수점으로 변환할 수 없는 문자열인 경우 0을 반환한다.

atoi
형식 : int atoi(char *string)
설명 : 문자열을 정수 값으로 변환하는 함수, 변환할 수 없는 경우에는 0을 반환한다.

atol
형식 : int atol(char *string)
설명 : 문자열을 long integer값으로 변환하는 함수, 변환할 수 없는 경우에는 0을 반환한다.

itoa
형식 : char *itoa(int value, char *string, int radix)
설명 : 정수형 숫자를 문자열로 변환하는 함수

ltoa
형식 : char *ltoa(long value, char *string, int radix)
설명 ; long integer형 숫자를 문자열로 변환하는 함수

strtod
형식 : double strtod(char *string, char *endptr)
설명 : 문자열을 부동소수점 값으로 변환하는 함수, 실패한 경우 0을 반환한다. 변환할 수 없는 문자를 만난 경우, 읽기를 중단한다.

strtol
형식 : long strtol(char *string, char *endptr, int radix)
설명 : 문자열을 long integer형 숫자로 변환하는 함수, 변환할 수 없는 문자열인 경우 0을 반환한다.

strtoul
형식 : unsigned long strtoul(char *string, char *endptr, int radix)
설명 : 문자열을 unsigned long형의 숫자로 변환하는 함수, 변환할 수 없는 문자열인 경우 0을 반환한다.


2. 디렉토리 조작 함수

헤더 파일 : #include

chdir
형식 : int chdir(char *path)
설명 : 현재 디렉토리를 주어진 경로로 바꾸는 함수

getcwd
형식 : char *getcwd(char *path, int numchars)
설명 : 현재의 작업 디렉토리의 이름을 반환하는 함수

mkdir
형식 : int mkdir(char *path)
설명 ; 주어진 경로를 사용하여 디렉토리를 만드는 함수

rmdir
형식 : int rmdir(char *path)
설명 : 주어진 경로의 디렉토리를 삭제하는 함수


3. 버퍼 조작 함수

헤더 파일 : #include

memchr
형식 : void *memchr(void *s, int c, size_t n)
설명 : 버퍼에 문자를 찾는 함수

memcmp
형식 : int memcmp(void *s1, void s2, size_t n)
설명 : 두 버퍼를 비교하는 함수

memcpy
형식 : void *memcpy(void *dest, void *src, size_t n)
설명 : 버퍼의 내용을 복사하는 함수

memmove
형식 : void *memmove(void *dest, void *src, size_t n)
설명 : 바이트 수만큼 src버퍼에서 dest버퍼로 이동시키는 함수

memset
형식 : void *memset(void *s, int c, size_t n)
설명 : 주어진 문자로 버퍼로 채우는 함수


4. 파일 조작 함수

헤더 파일 : #include

chmod
형식 : int chmod(char *path, int pmode)
설명 : 파일의 permission을 바꾸는 함수

fstat
형식 : int fstat(int handle, struct stat *buffer)
설명 : 파일의 상태 정보를 가져오는 함수

remove
형식 : int remove(char *path)
설명 : 파일을 삭제하는 함수

rename
형식 : int rename(char *oldname, char *newname)
설명 : 파일의 이름을 바꾸는 함수

stat
형식 : int stat(char *path, struct stat *buffer)
설명 : 파일의 상태 정보를 가져오는 함수

umask
형식 : unsigned umask(unsigned pmode)
설명 : 파일의ㅣ permission을 mask시키는 함수

5. Stream 입출력 함수

헤더 파일 : #include

clearerr
형식 : void clearerr(FILE *file_pointer)
설명 : stream의 에러 지시자를 지우는 함수

fclose
형식 : int fclose(FILE *file_pointer)
설명 : 파일을 닫는 함수, 정상적으로 수행되면 0을 에러가 발생되면 EOF을 반환한다.

feof
형식 : int feof(FILE *file_pointer)
설명 : 파일의 끝을 검사하는 함수, 지정된 파일이 EOF이면 0이외의 값을 반환한다.

ferror
형식 : int ferror(FILE *file_pointer)
설명 : 파일의 입출력 동안 에러가 발생되었는지를 검사하는 함수, 에러가 있으면 0이외의 값을 반환한다.

fflush
형식 : int fflush(FILE *file_pointer)
설명 : 버퍼의 내용을 파일에 쓰는 함수, 정상적으로 수행이 끝나면 0을 반환하고 그 이외에는 EOF를 반환한다.

fgetc
형식 : int fgetc(FILE *file_pointer)
설명 : stream으로부터 한 문자를 가져오는 함수, 에러 발생이나 파일의 끝인 경우에는 EOF를 반환한다.

fgetpos
형식 : int fgetpos(FILE *file_pointer, fpos_t current_pos)
설명 : stream에서 현재 위치를 가져오는 함수

fgets
형식 : char *fgets(char *string, int maxchar, FILE *file_pointer)
설명 : 파일에서 문자열을 읽는 함수, 읽어들이는 단위는 EOF나 \n을 만나거나 n-1개의 문자 길이 만큼이다. 실패한 경우 NULL을 반환한다.

fopen
형식 : FILE *fopen(char *filename, char *access_mode)
설명 : 파일을 열기 위한 함수, 에러가 발생되면 NULL을 반환한다.

fprintf
형식 : int fprintf(FILE *file_pointer, char *format_string, args)
설명 : 파일에 주어진 형식으로 데이터를 쓰기 위한 함수, 정상적으로 수행이 되면 출력한 문자의 수를 반환한다. 만약 에러가 발생되면 EOF를 반환한다.

fputc
형식 : int fputc(int c, FILE *file_pointer)
설명 : 문자를 stream에 쓰기 위한 함수, 정상적으로 수행이 되면 출력한 문자의 수를 반환한다. 에러가 발생되면 EOF를 반환한다.

fputchar
형식 : int fputchar(int c)
설명 : 문자를 stdout에 쓰기 위한 함수

fputs
형식 : int fputs(char *string, FILE *file_pointer)
설명 : 문자열을 stream에 쓰기 위한 함수, 에러가 발생되면 EOF를 반환한다.

fread
형식 : size_t fread(char *buffer, size_t size, size_t count, FILE *file_pointer)
설명 : stream으로부터 unformatted data를 buffer에 쓰기 위한 함수, 읽어들인 블록의 수를 반환한다.

freopen
형식 : FILE *freopen(char *filename, char *access mode, FILE *file_pointer)
설명 : 파일 포인터를 다른 파일에 재 할당하기 위한 함수

fscanf
형식 : int fscaf(FILE *file_pointer, char *format string, args)
설명 : stream으로부터 formatted input을 읽기 위한 함수, stream파일에서 형식대로 읽혀진 데이터 수를 반환한다. format의 형식은 scanf()와 같다.

fseek
형식 : int fseek(FILE *file_pointer, long offset, int origin)
설명 : 파일의 현재 위치에서 새로운 위치로 변경하는 함수, 정상적으로 수행했을 경우 0을 반환한다.

fsetpos
형식 : int fsetpos(FILE *file_pointer, fpos_t *current pos)
설명 : 파일의 현재 위치에서 새로운 위치로 변경하는 함수

ftell
형식 : long ftell(FILE *file_pointer)
설명 : 파일에서의 현재 위치를 가져오는 함수 에러가 발생되면 -1을 반환한다.

fwrite
형식 : size_t fwrite(char *buffer, size_t size, size_t count, FILE *file_pointer)
설명 : 버퍼에 있는 unformatted data를 stream에 쓰기 위한 함수

getc
형식 : int getc(FILE *file_pointer)
설명 : 문자를 stream으로부터 읽기 위한 함수

getchar
형식 : int getchar(void)
설명 : srdin으로부터 문자를 읽기 위한 함수

gets
형식 : char *gets(char *buffer)
설명 : srdin으로부터 라인을 버퍼로 읽는 함수

printf
형식 : int printf(int c, FILE *file_pointer)
설명 : formatted output을 stdout에 쓰는 함수

putc
형식 : int putc(int c, FILE *file_pointer)
설명 : 문자를 steam에 쓰기 위한 함수

putchar
형식 : int putchar(int c)
설명 : 문자를 stdout에 쓰기 위한 함수

puts
형식 : int puts(char *string)
설명 : 문자열을 stdout에 쓰기 위한 함수

rewind
형식 : void rewind(FILE *file_pointer)
설명 : 파일을 rewind하기 위한 함수

scanf
형식 : int scanf(char *format_string, args)
설명 : stdin으로부터 formatted input을 읽는 함수

setbuf
형식 : void setbuf(FILE *file_pointer, char *buffer)
설명 : stream을 위해 새로운 버퍼를 지정하는 함수

setvbuf
형식 : int setvbuf(FILE *file_pointer, char *buffer, int buf_type, size_t buf_size)
설명 : 새로운 버퍼를 지정하고 제어하는 함수

sprintf
형식 : int sprintf(char *string, char *format_string, args)
설명 : formatted output을 문자열로 쓰는 함수

sscanf
형식 : int sscanf(char *buffer, char *format_string, args)
설명 : 문자열로부터 formatted input을 읽는 함수

tmpfile
형식 : FILE *tmpfile(void)
설명 : temporary 파일의 이름을 가져오기 위한 함수

tmpnam
형식 : char *tmpnam(char *file_name)
설명 : temporary 파일의 이름을 가져오기 위한 함수

ungetc
형식 : int ungetc(int c, FILE *file_pointer)
설명 : 문자를 stream의 버퍼에 되돌려 주는 함수


6. Low level 입출력 함수

헤더 파일 : #include 외에 #include , #include , #include , #include

close
형식 : int close(int handle)
설명 : unbuffered I/O를 위해 열어 놓은 파일을 닫기 위한 파일, 정상적으로 수행되었을 경우 0을 반환한다. 에러가 발생되었을 경우에는 -1을 반환한다.

creat
형식 : int creat(char *filename, int pmode)
설명 : 주어진 permission을 갖는 새로운 파일을 생성하기 위한 파일, 에러가 발생되었을 경우에는 -1을 반환한다.

eof
형식 : int eof(int handle)
설명 : 파일의 끝을 검사하는 파일, 지정된 파일의 현재 위치가 파일의 끝이면 1을 반환하고 그렇지 않을 경우에는 0을 반환한다.

lseek
형식 : long lseek(int handle, long offset, int orgin)
설명 : 파일의 주어진 위치로 이동하는 함수

open
형식 : int open(char *filename, int oflag, unsigned pmode)
설명 : low-level I/O를 위해 파일을 여는 함수

read
형식 : int read(int handle, char *buffer, unsigned length)
설명 : 파일로부터 바이너리 데이터를 버퍼로 읽는 함수, 읽은 문자의 바이트 수를 반환한다. 파일의 끝일 경우에는 EOF를 반환한다. 에러가 발생되면 -1을 반환한다.

write
형식 : int write(int handle, char *buffer, unsigned count)
설명 : 버퍼에 있는 바이너리 데이터를 파일에 쓰는 함수, 정상적으로 수행되었을 경우에는 쓴 문자의 바이트 수를 반환한다. 에러가 발생되었을 경우에는 -1을 반환한다.


7. Mathematics

헤더 파일 : #intclude

abs
형식 : int abs(int n)
설명 : 정수의 절대값을 구하는 함수

acos
형식 : double acos(double x)
설명 : x의 arc cosine을 계산하는 함수

asin
형식 : double asin(double x)
설명 : x의 arc sine을 계산하는 함수

atan
형식 : double atan(double x)
설명 : x의 arc tangent를 계산하는 함수

atan2
형식 : double atan2(double y, double x)
설명 : y/x의 arc tangent를 계산하는 함수

ceil
형식 : double ceil(double x)
설명 : x를 초과하는 가장 작은 integral 값을 구하는 함수

cos
형식 : double cos(double x)
설명 : cosine을 계산하는 함수

cosh
형식 : double cosh(double x)
설명 : x의 hyperbolic cosine을 계산하는 함수

div
형식 : div_t div(int number, int denom)
설명 : nunber/denom을 계산하여 몫과 나머지로 이루어진 구조체 div_t를 반환한다.
div_t의 형식은 다음과 같다.
type struct{
      int quot;
      int rem;
} div_t;

exp
형식 : x의 exponential을 계산하는 함수

fabs
형식 : double fabs(double x)
설명 : x의 절대값을 구하는 함수

floor
형식 : double floor(double x)
설명 : x보다 작은 가장 큰 integral값을 구하는 함수

fmod
형식 : double fmod(double x, double y)
설명 : x/y의 나머지를 반환하는 함수

frexp
형식 : double frexp(double x, int *expptr)
설명 : x를 mantissa와 exponent로 분리하는 함수

labs
형식 : labs(long n)
설명 : long integer의 절대값을 찾는 함수

ldexp
형식 : double ldexp(double x, int exp)
설명 : mantissa와 exponent로 값을 계산하여 반환하는 함수

ldiv
형식 : ldiv_t ldiv(long number, long denom)
설명 : long integer를 나눗셈하는 함수

log
형식 : double log(double x)
설명 : log(x)를 계산하는 함수

log10
형식 : double log10(double x)
설명 : base 10인 x의 log을 구하는 함수

modf
형식 : double modf(double x, double *inptr)
설명 : x를 fraction부분과 integer부분으로 분리하는 함수

pow
형식 : double pow(double x, double y)
설명 : x의 y승을 구하는 함수

rand
형식 : int rand(void)
설명 : 0에서 32사이의 random 정수를 구하는 함수

random
형식 : int random(int max_num)
설명 : 0에서 max_num)사이의 random 정수를 구하는 함수

randomize
형식 : void randomize(void)
설명 : random 수를 발생시키기 위해 seed를 지정하는 함수

sin
형식 : double sin(double x)
설명 : sine을 계산하는 함수

sinh
형식 : double sinh(double x)
설명 : x의 hyperbolic sine을 계산하는 함수

sqrt
형식 : double sqrt(double x)
설명 : x의 양의 제곱근을 계산하는 함수

srand
형식 : void srand(unsigned seed)
설명 : random 수 발생을 위해 새로운 seed를 지정하는 함수

tan
형식 : double tan(double x)
설명 : x의 tangent를 계산하는 함수

tanh
형식 : double tanh(double x)
설명 : x의 hyperbloic tangent를 계산하는 함수


8. 메모리 조작 함수

헤더 파일 : #include

calloc
형식 : void *calloc(size_t num_elem, size_t elem_size)
설명 : 배열을 할당하고 모든 원소를 0으로 초기화하는 함수

free
형식 : void free(void *mem_address)
설명 : 할당된 메모리 블록을 되돌려 주는 함수

malloc
형식 : void *malloc(size_t num_bytes)
설명 : 메모리 블록을 할당하는 함수

realloc
형식 : 메모리 블록을 재 할당하는 함수


9. 탐색과 정렬 함수

헤더 파일 : #include

bsearch
형식 : void *bsearch(void *key, void *base, size_t num, size_t width, int (*com pare)(void *elem1, void *elem2)
설명 : 이진 탐색을 수행하는 함수

qsort
형식 : void qsort(void *base, size_t num, size_t width, int (*compare)(void *elem1, void *elem2)
설명 : quick sort 알고리즘을 이용하여 정렬을 수행하는 함수


10. 문자열 조작 함수

헤더 파일 : #include

strcat
형식 : int strcat(char *string1, char *string2)
설명 : 두 문자열을 결합하여 하나의 문자열로 만드는 함수

strcmp
형식 : int strcmp(char *string1, char *string2)
설명 : 문자열을 알파벳 순서로 비교하는 함수, 두 문자열이 같으면 0을 반환한다. 만약 같지 않으면 다음과 같은 값을 반환한다.

string1 < string2 이면 음수 값을 반환
string1 > string2 이면 양수 값을 반환

strcpy
형식 : char *strcpy(char *string1, char *string2)
설명 : 문자열 string2를 string1으로 복사하는 함수

strerror
형식 : char *strerror(int errnum)
설명 : 주어진 에러 번호에 해당되는 에러 메시지를 가져오는 함수

strlen
형식 : int strlen(char *string)
설명 : 문자열의 길이를 구하는 함수 이때 NULL문자는 제외하고 길이를 구한다.

strncat
형식 : char *strncat(char *string1, char *string2, size_t n)
설명 : string2의 문자를 string1 끝에 붙이는 함수

strncmp
형식 : int strncmp(char *string1, char *string2, size_t n)
설명 : 두 문자열의 처음 n개의 문자를 비교하는 함수

strncpy
형식 : char *strncpy(char *string1, char *string2, size_t n)
설명 : string2의 처음 n개의 문자를 string1에 복사하는 함수

strnset
형식 : char *strnset(char *string, int c, size_t n)
설명 : 문자열의 처음 n개 문자를 c로 만드는 함수

strrchr
형식 : char *strrchr(char *string, int c)
설명 : 문자열에서 마지막에 나오는 문자 c를 찾는 함수 만약, 해당되는 문자가 발견되지 않은 경우에는 NULL을 반환한다.


11. 시간 함수

헤더 파일 : #include

asctime
형식 : char *asctime(struct tm *time)
설명 : struct tm 형식의 시간을 문자열로 바꾸는 함수

clock
형식 : clock_t clock(void)
설명 : clock tick으로 경과된 시간을 가져오는 함수

ctime
형식 : char *ctime(time_t *time)
설명 : 이진 시간을 문자열로 바꾸는 함수

difftime
형식 : double difftime(time_t time1, time_t time2)
설명 : 두 시간 사이의 차를 초단위로 계산하는 함수

gmtime
형식 : struct_tm *gmtime(time_t *time)
설명 : Greenwich Meam Time(GMT)을 tm structuregudtlr으로 가져오는 함수

localtime
형식 : struct tm *localtime(time_t *time)
설명 : local time을 tm structure형식으로 가져오는 함수

time
형식 : time_t time(time_t *timeptr)
설명 : GMT 1970년부터 경과된 현재 시간을 가져오는 함수


12. 문자 분류 및 변환 함수

헤더 파일 : #include

isalnum
형식 : int isalnum(int c)
설명 : c가 alphanumeric이면 참값을 반환

isalpha
형식 : int isalpha(int c)
설명 : c가 letter이면 참값을 반환

isascii
형식 : int isascii(int c)
설명 : c가 ASCII이면 참값을 반환

iscntrl
형식 : int iscntrl(int c)
설명 : c가 control 문자이면 참값을 반환

isdigit
형식 : int isdigit(int c)
설명 : c가 decimal digit이면 참값을 반환

isgraph
형식 : int isgraph(int c)
설명 : c가 graphic c문자이면 참값을 반환

islower
형식 : int islower(int c)
설명 : c가 소문자이면 참값을 반환

isprint
형식 : int isprint(int c)
설명 : c가 인쇄 가능한 문자이면 참값을 반환

ispunct
형식 : int ispunct(int c)
설명 : c가 punctuation 문자이면 참값을 반환

isspace
형식 : int isspace(int c)
설명 : c가 공백 문자이면 참값을 반환

isupper
형식 : int tsupper(int c)
설명 : c가 대문자이면 참값을 반환

isxdigit
형식 : int isxdigit(int c)
설명 : c가 hexadecimal digit이면 참값을 반환

toascii
형식 : int toascii(int c)
설명 : c를 ASCII로 변환하는 함수

tolower
형식 : tolower(int c)
설명 : c를 소문자로 변환하는 함수

toupper
형식 : int toupper(int c)
설명 : c를 대문자로 변환하는 함수


13. 기타 함수

다음은 화면 제어에 관한 라이브러리 함수들이다.

헤더 파일 : #include

clreol
형식 : void clreol(void)
설명 : 커서의 현 위치 행을 지우는 함수

clrscr
형식 : void clrscr(void)
설명 : 현재 사용 중인 윈도우를 지우고 커서를 왼쪽 상단으로 이동시키는 함수

deline
형식 : void deline(void)
설명 : 커서가 있는 행을 삭제하는 함수

gettext
형식 : int gettext(int left, int top, int right, int bottom, void *dest)
설명 : 지정된 텍스트 화면의 내용을 dest로 읽어 들이는 함수

gettextinfo
형식 : void gettextinfo(struct text_info r)
설명 : 현재의 텍스트 모드의 정보를 구조체 r로 읽어 들이는 함수, 구조체의 r의 형식은 다음과 같다.

struct text_info {
      unsigned char currmode;
      unsigned char screenheigh;
      unsigned char screenwidth;
      unsigned char normattr;
      unsigned char winleft;
      unsigned char wintop;
      unsigned char winright;
      unsigned char winbottom;
      unsigned char curx;
      unsigned char cury;
} *r;


출처 : http://blog.naver.com/kkwwhh7/100003308350

'C' 카테고리의 다른 글

c 표준 라이브러리 함수  (0) 2012.03.30
Call by Reference  (0) 2012.03.19
\n  (0) 2012.03.19
Call by Reference C 2012. 3. 19. 23:59
Call by Value 로의 함수 호출은 일반적으로 많이 사용해 왔고
그닥 설명이랍시고 달지 않아도 어떤 개념인지 알 듯 하여

주소값(포인터)을 가르키고 그 주소값에 인자를 전달하여 함수를 호출하고
값을 가지고 도는 Call by Reference 프로그램을 작성하여 연습해 본다.

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int Menu(int *j, char (*emp_no)[7], char (*name)[20], char (*gender)[10], char (*jik)[20])
  5. /* int값을 바라보는 포인터로써 *을 써주고, 배열의 인자크기를 선언함으로 2차원 배열임을
    기술하는 의미로
    형선언 후 행을 가르키는 의미로 *와 인자의 크기를 뒤에 기재
    : (*emp_no)=emp_no[] */
  6. {
  7.     int num; /* 지역변수 */
  8.  
  9.     while(1)
  10.     {
  11.         printf(" 메뉴를 선택하세요 ");
  12.         printf("1.리스트 2.검색 3.등록 4.수정 5.삭제 0.종료 : ");
  13.         scanf("%d", &num);       
  14.        
  15.         switch(num)
  16.         {
  17.             case 1:
  18.                 List(j, emp_no, name, gender, jik);
    /* j의 포인터형을 Menu에서 값을 받아와서 j 로 선언 무방 */
  19.                 break;
  20.             case 2:
  21.                 Src(emp_no, name, gender, jik);
  22.                 break;
  23.             case 3:
  24.                 Add(j, emp_no, name, gender, jik);
  25.                 break;
  26.             case 4:
  27.                 Edit(emp_no, name, gender, jik);
  28.                 break;
  29.             case 5:
  30.                 Del(j, emp_no, name, gender, jik);
  31.                 break;
  32.             case 0:
  33.                 system("pause");
  34.                 return 0;
  35.             default:
  36.                 printf("잘못된 번호! ");
  37.         }
  38.     }
  39. }
  40. int ClearEnter(void) /* 엔터버림 */
  41. {
  42.     while(getchar()!='\n');
  43. }
  44. int Add(int *j, char (*emp_no)[7], char (*name)[20], char (*gender)[10], char (*jik)[20])
  45. {
  46.     char ans; /* Yes or No */
  47.     int i; /* 중복체크용 변수 선언 */
  48.     int p; /* 기존 지역변수로 j값을 썼던 것을 대체 */
  49.    
  50.     /* j값을 지역변수로 쓰면 안됨.. */
  51.     for(p=0; p<5; p++) /* 배열의 행값 증가 */
  52.     {
  53.         if(p>4) /* 5개 이상 등록되지 않도록 막음 */
  54.             printf("더이상 입력불가!! ");
  55.         /* emp_no[p]의 값이 NULL과 같다면 0 */
  56.         /* strcmp(s1, s2); : 0(s1=s2), -(s1>s2), +(s1<s2) */
  57.         /* 아래는 !0 : 0이 아니라면, 즉 같지 않다면, emp_no[p]가 빈값이 아니라면 */
  58.         else if(!strcmp("", emp_no[p]))
  59.         {
  60.             while(1)
  61.             { 
  62.                 if(p>4 || strcmp("", emp_no[p]))
    /* emp_no[p]가 빈값이 아니거나 p가 4보다 크다면 */
  63.                     break;
  64.                 printf(" 사번 : ");
  65.                 scanf("%s", emp_no[p]); /* 문자열은 엔퍼센트 연산자를 붙이지 않음 */
  66.                
  67.                 ClearEnter();
  68.                
  69.                 for(i=1; i<5; i++) /* 사번 중복체크 구간 시작 */
  70.                    if(!strcmp(emp_no[p], emp_no[p-i]))
  71.                     {
  72.                         printf("이미 등록된 사번입니다!!");
  73.             /* 이미등록된 사번임을 체크했지만 65행에서 그 값을 입력받았으므로 초기화 함 */
  74.                         memset(emp_no[p],0x00,sizeof(emp_no[p]));
  75.                         return 1;
  76.                     } /* 사번중복체크 구간 끝 */
  77.                 printf("이름 : ");
  78.                 scanf("%20s", name[p]);
  79.                 printf("성별 : ");
  80.                 scanf("%10s", gender[p]);
  81.                 printf("직위 : ");
  82.                 scanf("%20s", jik[p]);
  83.                
  84.                 ClearEnter();
  85.  
  86.                 while(1)
  87.                 {
  88.                     printf("위와같이 등록, 계속 등록하시겠습니까? (Y/N) ");
  89.                     scanf("%c", &ans);
  90.                     if(ans=='y'||ans=='Y'||ans=='\n') /* y or Y or Enter */
  91.                         {
  92.                             (*j)++; /* *j++ : 주소값(e.g.> 0x02...)을 1증가함 */                           
  93.                             break; /* 현재 while문을 빠져나가므로 61행의 while문으로 이동 */
  94.                         }
  95.                     else if(ans=='n'||ans=='N')
  96.                         {
  97.                             (*j)++; /* (*j)++ : j의 주소를 가르키는 값을 1증가함 */
  98.                             return 1;
    /* 현재 함수를 빠져나가고 (현재는)의미없는 1값을 호출한 함수에 반환 */
  99.                         }
  100.                     else
  101.                         printf("잘못된 선택입니다 "); /* 예외 처리 */
  102.                 }
  103.             }
  104.         }
  105.     }
  106.     if(p>4)
  107.         printf("더이상 입력불가!! ");
    /* 5개이상 등록 완료 후 Add()함수 호출시 메시지 출력 */
  108. }
  109.  
  110. int List(int *j, char (*emp_no)[7], char (*name)[20], char (*gender)[10], char (*jik)[20])
  111. /* char (*name)[20] : 2차원 배열의 포인터형 */
  112. {
  113.     int mm; /* 배열의 포인터값 증가 변수 */
  114.     printf(" --- 리스트보기 --- ");
  115.    
  116.     for(mm=0; mm<5; mm++)
    /* 배열의 주소에 값이 없을 때 리스트가 출력되지 않도록 하기 위함 */
  117.     {
  118.         if(strcmp("", emp_no[mm])) /* emp_no[mm]의 값이 NULL이 아닐 때 */
  119.         {
  120.             printf("사번: %-7s >> 이름: %-14s 성별: %-10s 직위: %-10s ", emp_no[mm], name[mm], gender[mm], jik[mm]);
  121.             /* emp_no[mm] : 주소값을 가르킴 */
  122.         }
  123.         else /* emp_no[mm]의 값이 NULL일 때 */
  124.         {
  125.             printf("");
  126.         }
  127.     }
  128.  
  129.     if(*j<=0) /* j 주소의 값이 0이거나 0보다 작을 때 이면 추가되지 않았거나 삭제되어
    데이터가 없을 때 */
  130.     {
  131.         printf("등록된 자료가 없습니다! ");
  132.     }
  133.     printf(" ");
  134.     system("pause");
  135. }
  136.  
  137. int Src(char (*emp_no)[7], char (*name)[20], char (*gender)[10], char (*jik)[20])
  138. {
  139.     char no_src[20]; /* 검색할 사번을 입력받을 1차원 배열의 변수 선언 */
  140.     int k=0, g=0;
    /* k:배열의 주소값을 가르키는 행값 증가용 변수, g:strcmp의 값을 담을 변수 */
  141.  
  142.     printf("검색할 사번을 입력하세요 : ");
  143.     scanf("%s", no_src)
  144.     ClearEnter();
  145.  
  146.     for(k=0; k<5; k++)
  147.     {
  148.        g=strcmp(no_src, emp_no[k]);
  149.  
  150.         if(g==0)
  151.             break;
  152.     }
  153.     if(g>0 || g<0)
  154.     {
  155.         printf("사번을 확인해주세요 ");
  156.         return 1;
  157.     }
  158.     printf(" 해당 사원 찾음 (사원번호: %s) ", no_src);
  159.     printf("조회하신 사원의 정보 입니다 ");
  160.     printf("이름: %-14s 성별: %-14s 직위: %-14s ", name[k], gender[k], jik[k]);
  161. }
  162.  
  163. int Edit(char (*emp_no)[7], char (*name)[20], char (*gender)[10], char (*jik)[20])
  164. {
  165.     char no_edit[20];
  166.     int k=0, g=0, e_num;
  167.  
  168.     printf("수정할 사번을 입력하세요 : ");
  169.     scanf("%s", no_edit);
  170.     ClearEnter();
  171.  
  172.     for(k=0; k<5; k++)
  173.     {
  174.         g=strcmp(no_edit, emp_no[k]);
  175.  
  176.         if(g==0)
    /* g값이 0이라는 것은 입력한 사번과 emp_no[k]의 값이 같다는 것을 의미하므로 */
  177.             break; /* 현재 반복문을 빠져 나가면 아래 while 문으로 이동 */
  178.     }
  179.     if(g>0 || g<0)
  180.     {
  181.         printf("사번을 확인해주세요 ");
  182.         return 1;
  183.     }
  184.     while(1)
  185.     {
  186.         printf(" 해당 사원 찾음 (사원번호: %s) ", no_edit);
                                            /* 입력받은 값과 같은 내용이 있는 */
  187.         printf("조회하신 사원의 정보 입니다 "); /* k행의 배열값을 출력함 */
  188.         printf("이름: %-14s 성별: %-14s 직위: %-14s ", name[k], gender[k], jik[k]);
  189.         printf(" 선택 : 1.이름  2.성별  3.직위  4.모두수정  5.취소 : ");
  190.         scanf("%d", &e_num);
  191.  
  192.         switch(e_num)
  193.         {
  194.             case 1:
  195.                 printf("수정하실 이름을 입력하세요 : ");
  196.                 scanf("%20s", name[k])
  197.                 printf("수정완료! ");
  198.                 printf("수정된 이름 : %s ", name[k]);
  199.                 return 1;
  200.             case 2:
  201.                 printf("수정하실 성별을 입력하세요 : ");
  202.                 scanf("%20s", gender[k]);
  203.                 printf("수정완료! ");
  204.                 printf("수정된 성별 : %s ", gender[k]);
  205.                 return 1;
  206.             case 3:
  207.                 printf("수정하실 직위를 입력하세요 : ");
  208.                 scanf("%20s", jik[k]);
  209.                 printf("수정완료! ");
  210.                 printf("수정된 직위 : %s ", jik[k]);
  211.                 return 1;
  212.             case 4:
  213.                 printf("수정하실 이름을 입력하세요 : ");
  214.                 scanf("%20s", name[k]);
  215.                 printf("수정하실 성별을 입력하세요 : ");
  216.                 scanf("%20s", gender[k]);
  217.                 printf("수정하실 직위를 입력하세요 : ");
  218.                 scanf("%20s", jik[k]);
  219.                 printf(" 수정완료! ");
  220.                 printf("수정된 내용 : 이름(%s), 성별(%s), 직위(%s) 입니다. ", name[k], gender[k], jik[k]);
  221.                 return 1;
  222.             case 5:
  223.                 return 1;
  224.             default:
  225.                 printf("잘못된 번호입니다 ");
  226.         }
  227.     }
  228. }
  229. int Del(int *j, char (*emp_no)[7], char (*name)[20], char (*gender)[10], char (*jik)[20])
  230. {
  231.     char no_del[20]; /* 사번을 입력 받는 1차원 배열 변수 */
  232.     int k=0, g=0;
  233.     char d_ans;
  234.  
  235.     printf("삭제할 사번을 입력하세요 : ");
  236.     scanf("%s", no_del);
  237.     ClearEnter();
  238.  
  239.     for(k=0; k<5; k++)
  240.     {
  241.         g=strcmp(no_del, emp_no[k]);
  242.  
  243.         if(g==0)
  244.         {
  245.             break;
  246.         }
  247.     }
  248.     if(g>0 || g<0)
  249.     {
  250.         printf(" 사번을 확인해주세요!! ");
  251.         return 1;
  252.     }
  253.     while(1)
  254.     {
  255.         printf(" 사원번호: %s ", no_del);
  256.         printf("이름(%s), 성별(%s), 직위(%s) ", &name[k], &gender[k], &jik[k]);
  257.         printf(" 위 자료를 삭제하시겠습니까? (Y/N) : ");
  258.         scanf("%c", &d_ans);
  259.  
  260.         if(d_ans=='y'||d_ans=='Y'||d_ans=='\n')
  261.             {
  262.                 printf("사번(%s)의 %s의 자료가 삭제 되었습니다 ", no_del, &name[k]);
  263.  
  264.                 memset(&emp_no[k],0x00,sizeof(emp_no[k]));
                    /* 0x00 으로 초기화 하여 데이터 삭제 */
  265.                 memset(&name[k],0x00,sizeof(name[k]));
  266.                 memset(&gender[k],0x00,sizeof(gender[k]));
  267.                 memset(&jik[k],0x00,sizeof(jik[k]));
  268.                 (*j)--;
  269.                 break;
  270.             }
  271.         else if(d_ans=='n'||d_ans=='N')
  272.             {
  273.                 return 1;
  274.             }
  275.         else
  276.             {
  277.                 printf("잘못된 선택입니다 ");
  278.             }
  279.     }
  280. }
  281. void HowTo(void)
  282. {
  283.     printf("--- 사원관리 프로그램 --- ");
  284.     printf("사원 관리 프로그램 입니다 ");
  285. }
  286. int main(void)
  287. {
  288.     /* 전역변수로 사용하던 것을 메인에 선언 */
  289.     char emp_no[5][7]; /* 2차원 배열 선언 */
  290.     char name  [5][20];
  291.     char gender[5][10];
  292.     char jik   [5][20];
  293.     int j=0,m=0;
  294.    
  295.     /* 변수값 초기화, 메모리를 지정한 문자열로 채움: memset */
  296.     /* memset(채울메모리주소, 채울문자, 채울문자의개수) */
  297.     for(j=0; j<5; j++)
  298.     {
  299.         memset(emp_no[j],0x00,sizeof(emp_no[j])); /* NULL 값 초기화 */
  300.         memset(name[j],0x00,sizeof(name[j]));
  301.         memset(gender[j],0x00,sizeof(gender[j]));
  302.         memset(jik[j],0x00,sizeof(jik[j]));
  303.     }
  304.    
  305.     j=0; /* j값 = 열의 행번호를 증감시킬 변수 */
  306.     /* 함수 호출. 프로그램 시작 */
  307.     HowTo(); /* 프로그램 소개글 호출 */
  308.     Menu(&j, emp_no, name, gender, jik); /* j의 주소값을 참조함 : &j */
  309.     /* 2차원 배열은 상단에 선언으로 이미 주소값을 가짐. 변수명만 기입해도 무방 */
  310.     return 0;
  311. }


'C' 카테고리의 다른 글

c 표준 라이브러리 함수  (0) 2012.03.30
Call by Reference  (0) 2012.03.19
\n  (0) 2012.03.19
\n C 2012. 3. 19. 00:54
C언어에서는 개행을 \n으로 표시한다.

그러나 이건 C언어만의 약속일뿐, 다른 환경에서의 개행은 이와 다르다.

그냥...▽
Windows(ms-dos) : \r\n
Mac : \r
Unix : \n

예를 들어 Windows 환경) C프로그램에서 \n을 파일에 저장하면 \r\n으로 변환/저장되고
파일에 저장된 \r\n을 C프로그램상에서 읽으면 \n으로 변환되어 읽혀진다.
대충 잡담은 여기까지 하고 ㅎㅎ

개행 문자를 이용한 예로

while(getchar()!='\n');
 

개행이라는건 '엔터'가 아니던가. 개행, 즉 엔터는 \n으로 표현된다.
위의 소스를 분석해보면
getchar() 함수는 키보드로부터 문자를 읽어들이는 함수이고
키보드로 부터 \n , 즉 엔터값이 입력되기 전까지 반복(while)하겠다.

즉, Enter를 치면 (반복을)종료하겠다 라는 뜻이라 볼 수 있겠고
엔터값을 입력값으로 받지 않을 때 유용하다.

그 반대인 while(getchar()=='\n') 은 Enter값이 입력되는 순간부터 반복을 하겠지?

여튼..활용 예는

int
ClearEnter(void)
{
    while(getchar()!='\n');
}
/* 이런식으로 함수로 선언해주고 */
/*                :                          */
printf("무언가를 입력하세요 : ");
scanf("%s" &thing[i]);
ClearEnter();
printf("blah blah..... : ");
scanf(....... );
/*                :                          */ 

예제 소스가 관련성은 없다 보이지만......여튼 그게 중요한게 아님 ㅎㅎ
위처럼 엔터값을 버림으로 엔터값이 다음 함수에 영향을 미치지 않도록 하고 싶을 때 사용하면 되겠다.

'C' 카테고리의 다른 글

c 표준 라이브러리 함수  (0) 2012.03.30
Call by Reference  (0) 2012.03.19
\n  (0) 2012.03.19