파일 입 출력

 

#include <stdio.h>

 

FILE* fopen(const char * filename, const char *mode)

 

 filename

개방하고자 하는 파일의 경로명과 파일명을 동시에 지니는 문자열

 ) filename = “c:\\work\\test.dat” (c:\\work 는 경로명 test.dat 은 파일명)

   *특수문자 역슬래시(\)와 구분하기 위해 (\\) 를 두개 써준다.

 mode

파일의 특징 및 용도를 결정짓는다.

             파일 개방 모드=파일접근모드+데이터 입 출력모드

 

파일 접근 모드

모드

의미

r

    - 파일의 읽기 위해서 개방한다. 오로지 읽는 것만 가능하다.

w

-         데이터를 쓰기 위해 개방한다. 쓰는 것만 가능

-         만약에 fopen함수 호출 시 지정해 준 파일이 존재하지 않으면, 새로운 파일을 생성해서 데이터를 쓰게 된다.

-         지정해 준 파일이 존재하면, 그 파일의 데이터를 지워버리고 데이터를 쓰게 된다.

a

-         w 모드와 달리, 지정해 준 파일이 존재하면 데이터를 지우지 않고 파일의 끝에서부터 데이터를 추가한다.

-         너머지 특징은 w와 같다.

r+

-         파일을 읽고 쓰기 위해 개방한다.

-         파일이 존재하지 않는 경우, 새로운 파일을 생성한다.

-         파일이 존재하는 경우, 파일의 데이터를 지우지 않지만 원래 존재하는 파일의 데이터를 덮어쓰게 된다.

w+

-         r+ 모드와 달리, 지정해 준 파일이 존재하면 모든 데이터를 지워버리고 데이터를 기록한다.

-         나머지 특징은 r+와 같다.

a+

-         r+ 모드와 달리, 지정해 준 파일이 존재하면 파일의 끝에서부터 데이터를 추가한다. (나머지 특징은 r+와 같다.)

 

 

데이터 입출력 모드

모드

의미

t

텍스트 모드 (text mode)

b

  2진 모드(binary mode)

 

 CR(Carriage Return)

 CR은 특수문자 \r로 표현되며, 커서의 위치를 그 중 맨 앞으로 이동하라는 의미

 LF(Line Feed)

 LF \n로 표현 되며, 커서의 위치를 그 다음 줄로 이동하라는 의미이다.

 

“ABC \r DEF”  -> 출력

D

E

F

 

 

 

 

 

 

 

 

 

 

 

 

 

“ABC \n DEF”  -> 출력

A

B

C

 

 

 

 

 

 

 

 

D

E

F

 

 

“ABC \r\n DEF”  -> 출력

A

B

C

 

 

 

 

 

D

E

F

 

 

 

 

 

 

 2진 모드와 텍스트 모드

-         2진 모드: 프로그램상에서 파일로 데이터를 쓰거나 읽어 들이는 경우에 아무런 데이터의 변환도 일으키지 않는 데이터 입출력 모드를 의미한다.

-         텍스트 모드 : 프로그램상에서 파일로 데이터를 쓰거나 읽어 들이는 경우에 데이터 변환이 일어나는 입출력 모드를 의미한다.

(printf와 같은 표준 출력 함수들은 텍스트 모드로 출력하기 때문에 C에서 \n을 입력할 경우\r\n으로 변환되어 출력된다.)

 

FILE 구조체의 포인터 (파일 포인터)

-         fopen 함수의 리턴 값은 FILE이라는 구조체 변수의 포인터이다. FILE 구조체 변수는 개방한 파일에 대한 여러 가지 정보를 지니는 변수이다. 개방한 파일이 무엇인지, 파일 내에 존재하는 데이터를 어디까지 읽어 들였는지, 파일의 끝에 도달했는지에 대한 정보들을 FILE구조체 변수는 지닌다.

 

 

◊ 파일 입출력 함수

-         puts함수는 스트림이 stdout으로 미리 정해져 있지만 fputs함수는 스트림을 지정할 수 있다. 파일 포인터는 스트림을 의미한다.

 

         스트림

기능

키보드/모니터

선택(키보드/모니터,파일)

문자 출력

int putchar(int c)

int fputc(int c, FILE* stream)

문자 입력

int getchar(void)

int fgetc(FILE* stream)

문자열 출력

int puts(const char* s)

int puts(const char* s, FILE* stream)

문자열 입력

char* gets(char* s)

char* fgets(char* s, int n, FILE* stream)

형식 지정

출력

int printf(const* format,...)

int fprintf(FILE* stream,

     const char* format, …)

형식 지정

입력

int scanf(

    Const char* format,…)

int fscanf(FILE* stream,

    const char* format,..)

 

 feof 함수

 

#include <stdio.h>

 

int feof(FILE *stream)

호출 시 전달되는 파일 포인터가 가리키는 파일이 끝에 도달 할 경우 0이 아닌 값을 리턴한다.

 

◊ fseek 함수

#incldue <stdio.h>

 

int fseek(FILE *stream, long offset, int wherefrom)

파일 위치 지시자를 원하는 위치로 이동시키는 함수이다.

Stream이 가리키는 파일의 파일 위치 지시자를 시작위치 wherefrom에서부터 offset 만큼 이동한다.

 

wherefrom전달인자

whrerfrom

파일 위치 지시자를 offset 만큼 이동하기 전

SEEK_SET(0)

파일의 맨 앞으로 이동한다.

SEEK_CUR(1)

현재 위치

SEEK_END(2)

파일의 맨 끝으로 이동한다.

 

Posted by cyj4369
,
winsock을 이용한 파일 보내기(C++) 소스
 
#include<winsock2.h>
#include<stdio.h>
#include<stdlib.h>
 
#define BUFSIZE 4096
 
// 소켓 함수 오류 출력 후 종료
void err_quit(char *msg)
{
           LPVOID lpMsgBuf;
           FormatMessage(
                     FORMAT_MESSAGE_ALLOCATE_BUFFER|
                     FORMAT_MESSAGE_FROM_SYSTEM,
                     NULL, WSAGetLastError(),
                     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                     (LPTSTR)&lpMsgBuf, 0, NULL);
           MessageBox(NULL, (LPCTSTR)lpMsgBuf, msg, MB_ICONERROR);
           LocalFree(lpMsgBuf);
           exit(-1);
}
 
// 소켓 함수 오류 출력
void err_display(char *msg)
{
           LPVOID lpMsgBuf;
           FormatMessage(
                     FORMAT_MESSAGE_ALLOCATE_BUFFER|
                     FORMAT_MESSAGE_FROM_SYSTEM,
                     NULL, WSAGetLastError(),
                     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                     (LPTSTR)&lpMsgBuf, 0, NULL);
           printf("[%s] %s", msg, (LPCTSTR)lpMsgBuf);
           LocalFree(lpMsgBuf);
}
 
int main(int argc, char *argv[])
{
 
    int err;
 
           if(argc < 2){
                     fprintf(stderr, "Usage: %s <FileName>\n", argv[0]);
                     return -1;
           }
 
          
           WSADATA wsa;
           if(WSAStartup(MAKEWORD(2,2),&wsa) !=0 )
                     return -1;
 
           SOCKET senderSock = socket(AF_INET,SOCK_STREAM, 0);
    if(senderSock == INVALID_SOCKET){
                                             err_quit("socket()");
                                                                                               }
          
           // connect()
           SOCKADDR_IN senderaddr;
           ZeroMemory(&senderaddr,sizeof(senderaddr));
           senderaddr.sin_family = AF_INET;
           senderaddr.sin_port = htons(9000);
           senderaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
          
           err = connect(senderSock, (SOCKADDR *)&senderaddr,sizeof(senderaddr));    
           if(err == SOCKET_ERROR) err_quit("connect()");
 
 
           //파일 열기
           FILE *fp = fopen(argv[1],"rb");
 
           if(fp== NULL)
           {
            perror("파일 입출력 오류");
            return -1;
           }
 
           //파일 이름 보내기
           char filename[256];
           ZeroMemory(filename,256);
           sprintf(filename,argv[1]);
           err = send(senderSock,filename,256,0);
           //if(err == SOCKET_ERROR) err_quit("send()");
 
 
           //파일 크기 얻기
           fseek(fp,0,SEEK_END);//파일 포인터를 파일의 끝으로 옮김
           int totalbytes = ftell(fp);
 
           printf("크기 :%d bytes\n",totalbytes); //ansi로 된 text파일에 있는 문자
 
           err = send(senderSock,(char *)&totalbytes,sizeof(totalbytes),0);
           if(err == SOCKET_ERROR) err_quit("send()");
 
 
           //파일 데이터 전송에 사용할 변수
           char buf[BUFSIZE];
           int numread;
           int numtotal = 0;
 
           //파일 데이터 보내기
 
           rewind(fp); // 파일 포인터를 제일 앞으로 이동
           while(1){
                     numread = fread(buf, 1, BUFSIZE, fp);
                     if(numread > 0){
                                err = send(senderSock, buf, numread, 0);
                                if(err == SOCKET_ERROR){
                                          err_display("send()");
                                          break;
                                }
                                numtotal += numread;
                     }
                     else if(numread == 0 && numtotal == totalbytes){
                                printf("파일 전송 완료!: %d 바이트\n", numtotal);
                                break;
                     }
                     else{
                                perror("파일 입출력 오류");
                                break;
                     }
           }
 
           fclose(fp);         
    closesocket(senderSock);
           WSACleanup();
 
return 0;
 
}
Posted by cyj4369
,
화면 처리 함수 
 
Visual C++에는 Turbo - C에서 사용할 수 있는 화면 처리 함수가 정의되어 있지 않습니다. 
이런 이유로 함수를 정의해서 이용해야 합니다. 
Turbo ? C에서는 conio.h를 인클루드 시켜 바로 사용하면 됩니다. 
gotoxy(int x, int y): x, y 좌표로 커서 이동 
wherex(): 현재 커서의 x좌표 리턴 
wherey(): 현재 커서의 y좌표 리턴 
함수를 아래와 같이 정의한 후 windows.h를 인클루드 시키면 됩니다. 
void gotoxy(int x, int y) 
     COORD Cur; 
     Cur.X=x; 
     Cur.Y=y; 
     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),Cur); 
   
 

// 커서의 x 좌표를 조사한다. 
int wherex() 
     CONSOLE_SCREEN_BUFFER_INFO BufInfo; 
   
 

     GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&BufInfo); 
     return BufInfo.dwCursorPosition.X; 
   
 

// 커서의 y좌표를 조사한다. 
int wherey() 
     CONSOLE_SCREEN_BUFFER_INFO BufInfo; 
   
 

     GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&BufInfo); 
     return BufInfo.dwCursorPosition.Y; 
예제23) 커서를 이동시킨 후 x 좌표와 y좌표를 출력하는 프로그램 
#include <stdio.h> 
#include <windows.h> 
void gotoxy(int x, int y) 
     COORD Cur; 
     Cur.X=x; 
     Cur.Y=y; 
     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),Cur); 
 
 

int wherex() 
     CONSOLE_SCREEN_BUFFER_INFO BufInfo; 
 
 

     GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&BufInfo); 
     return BufInfo.dwCursorPosition.X; 
int wherey() 
     CONSOLE_SCREEN_BUFFER_INFO BufInfo; 
     GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&BufInfo); 
     return BufInfo.dwCursorPosition.Y; 
int main() 
    int x, y; 
    gotoxy(30, 10); 
    x = wherex(); 
    y = wherey(); 
    printf("x좌표:%d y좌표:%d\n",x,y); 
    return 0; 
}
Posted by cyj4369
,
시스템 함수 
 
C에서는 프로그램의 실행을 종료하고 제어를 운영체제에게 돌려주는 함수와 시스템 명령을 수행할 수 있는 함수를 제공합니다. 
stdlib.h에 정의 되어 있습니다. 
 
 

1) exit 함수 
이 함수는 프로그램의 실행을 종료하고 제어를 운영체제에게 돌려주는 함수입니다. 
이 함수의 매개 변수로 0를 주면 성공을 알리고 운영체제에게 리턴하며 1을 주면 실패를 알리고 운영체제에게 제어를 넘겨주게 됩니다. 
 
 

예제21) exit()의 사용 
#include
<stdlib.h>

int main() 
    printf("Exit를호출하면이후문장은수행되지않습니다\n"); 
    exit(0); 
    printf("의미없는문장\n"); 
    return 0; 
}

 
 

2) system 함수 
운영체제의 시스템 명령을 수행할 수 있도록 해주는 함수입니다. 
예제22) system()의 사용 
#include
<stdio.h>

#include
<stdlib.h>

#include
<conio.h> 
int main() 
    printf("메모장실행\n"); 
    system("notepad.exe"); 
    printf("메모장을종료하면서자신의ping 확인"); 
    system("ping 127.0.0.1 -t"); 
    return 0; 
}
Posted by cyj4369
,
시간 관련 함수(time.h) 
 
모든 시간 함수의 원형은 time.h 헤더 파일에 선언되어 있으므로 시간 관련 함수를 사용하려면 반드시 time.h를 인클루드 해야 합니다. 
시간과 관련된 가장 기본적인 함수는 현재 시간을 구하는 time 함수이다. 
time_t time( time_t *timer ); 
char *ctime( const time_t *timer ); 
time 함수는 1970년 1월 1일 자정 이후 경과한 초를 조사하는데 리턴 타입인 time_t형은 시스템에 따라 달라지며 Windows에서는 4바이트 정수(typedef long time_t;)로 정의되어 있습니다. 
time 함수는 time_t형의 포인터를 인수로 받아 이 인수에 조사된 시간을 채워 주기도 하고 같은 값을 리턴 하기도 합니다. 
둘 중 아무 값이나 사용해도 상관없으며 리턴 값만 사용할 경우는 인수로 NULL을 전달할 수도 있습니다. 
이 함수는 최대 2038년 1월 18일까지의 날짜를 표현할 수 있으며 64비트 버전인 _time64 함수는 3000년 12월 31일까지 표현 가능합니다. 
이 함수가 조사하는 시간은 초 단위이기 때문에 이 값으로부터 우리가 일상적으로 사용하는 시간을 바로 구하기는 무척 어렵습니다. 
또한 세계 표준시 포맷으로 되어 있어 우리나라 시간과 일치하지도 않습니다. 
ctime 함수는 time_t형의 경과 초를 출력하기 편리한 문자열 형태로 바꾸며 세계 표준시로 된 시간을 지역 설정에 맞게 조정해 주기도 합니다. 
변환된 문자열은 26문자 길이로 되어 있으며 끝에 개행 문자가 있어 printf 등의 함수로 곧바로 출력할 수 있습니다. 
ctime이 변환 결과를 저장하기 위해 사용하는 버퍼는 라이브러리에서 미리 할당해 놓은 정적 메모리 영역이며 이 영역은 asctime, gmtime, localtime 등의 함수들이 공유합니다. 

예제4) 현재 시간 출력 
#include <stdio.h> 
#include <time.h> 
int main() 
time_t t; 
time(&t); 
printf("현재 시간은 %d입니다.\n", t); 
printf("현재 시간은 %s입니다.\n", ctime(&t)); 
return 0; 
}

 
 

char *_strdate(char *datestr); => 현재 날짜를 문자열로 리턴 
char *_strtime(char *timestr); => 현재 시간을 문자열로 리턴 
 
 

_strdate는 날짜를 MM/DD/YY 포맷으로 구해 datestr 버퍼에 복사하며 _strtime은 시간을 HH:MM:SS 포맷으로 구해 timestr 버퍼에 복사하는데 이 함수가 구해주는 시간은 24시간제입니다. 
두 함수로 전달되는 버퍼는 널 문자까지 고려하여 최소한 9바이트 이상이어야 합니다. 
 
 

예제5) 현재 날짜와 시간을 출력하는 예제 
#include <stdio.h> 
#include <time.h> 
int main() 
char Date[10]; 
char Time[10]; 
_strdate(Date); 
_strtime(Time); 
printf("날짜: %s, 시간: %s\n",Date,Time); 
     return 0; 
}

 
 

clock_t clock( void ); 
작업 시점의 시간을 출력해주는 함수 
처음 호출하면 0을 가지게 되고 두 번째 호출하게 되면 첫 번째 호출한 시점에서 경과한 시간을 리턴 시켜 주게 됩니다. 
예제6) for 문을 10000번 돌리는 데 걸리는 시간 
#include <stdio.h> 
#include <time.h> 
int main() 
    clock_t t1, t2; 
    int i; 
    t1=clock(); 
    for(i=0; i<10000; i++) 
    { 
        t2 = clock(); 
        printf("i=%d t2=%d\n",i,(t2-t1)); 
    } 
}

 
 

일정시간 동안 대기하는 sleep 함수 만들기 
#include
<stdio.h> 
#include
<time.h> 
void sleep(int n); 
int main() 
    int i; 
    for (i=1; i <= 10; i++) 
    { 
        printf("*"); 
        sleep(1000);      
    } 
void sleep(int n) 
    long time; 
    time = n + clock(); 
    printf("잠시대기\n"); 
    printf("%ld\n", time - clock() ); 
    while( time > clock() ) 
    {         
    } 
}



Tip. 조금 더 정확한 시간을 알고 싶다면??
STSREMTIME 구조체 사용
typedef struct _SYSTEMTIME { // st WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; WORD wMinute; WORD wSecond; WORD wMilliseconds; } SYSTEMTIME;
SYSTEMTIME SysTime;
GetLocalTime(&SysTime);
//%03d : 000포맷으로 빈 곳은 0으로 채움 19면 019로 표현 
printf("%02d, %03d",SysTime.wSecond, SysTime.wMilliseconds);

Posted by cyj4369
,
숫자와 문자열 변환 함수(stdlib.h) 
 
숫자와 문자열을 변환해주는 함수 
char *itoa(int value, char *string, int radix); 
int 형을 문자열로 변경 
char *ltoa(long value, char *string, int radix); 
long 형을 문자열로 변경 
char *ultoa(unsigned long value, char *string, int radix); 
unsigned long을 문자열로 변경 
 
 

예제18) itoa를 이용해서 10을 진법 별로 문자열로 변환 
#include <stdio.h> 
#include <stdlib.h> 
int main() 
    char str[100]; 
    int i = 10; 
    itoa(i,str,10); 
    printf("str = %s\n",str); 
    itoa(i,str,8); 
    printf("str = %s\n",str); 
    itoa(i,str,16); 
    printf("str = %s\n",str); 
    itoa(i,str,2); 
    printf("str = %s\n",str); 
    return 0; 
}

 
 

int atoi(const char *string); 
문자열을 정수로 변환 
숫자와 문자가 섞여 있다면 숫자가 있는 부분까지만 변환 
long atol(const char *string); 
문자열을 long 형 정수로 변환 
double atof( const char *string ); 
문자열을 double 형 정수로 변환 
long strtol(const char *nptr, char **endptr, int base); 
base 진법까지 인정해서 변경해줌. 
변환 불가능한 문자를 만나면 endptr로 리턴 
 
 

예제19) itoa를 이용해서 10을 진법 별로 문자열로 변환 
#include <stdio.h> 
#include <stdlib.h> 
int main() 
    char str[10] = "12car"; 
    int i; 
    i = atoi(str); 
    printf("i = %d\n",i); 
    i = strtol(str, NULL, 10); 
    printf("i = %d\n",i); 
    i = strtol(str, NULL, 10); 
    printf("i = %d\n",i); 
    i = strtol(str, NULL, 16); 
    printf("i = %d\n",i); 
    i = strtol(str, NULL, 8); 
    printf("i = %d\n",i); 
    i = strtol(str, NULL, 2); 
    printf("i = %d\n",i); 
 
 

    return 0; 
}
Posted by cyj4369
,
수학 함수(math.h) 
 
double sin(double x) => sin 
double cos(double x) => cos 
double tan(double x) => tan 
double sqrt(double x); => x의 제곱근 
double pow(double x, double y) => xy 
double floor(double x) => 소수 버림 (반올림은 0.5를 더한 후 소수를 버리면 됩니다. )
double ceil(double x) => 소수를 버리고 정수 값을 1증가 
int abs(int n) => 절대 값 
long labs(long n) => 절대 값 
double fabs(double x) => 절대 값 
 
예제1) 기본적인 수학 함수의 사용 
#include
<stdio.h> 
#include
<math.h> 
int main() 
int r; 
for (r=0;r<=90;r+=10) 
printf("sin(%d도)=%f\t",r,sin(r*3.1416/180)); 
    printf("cos(%d도)=%f\t",r,cos(r*3.1416/180)); 
    printf("tan(%d도)=%f\n",r,tan(r*3.1416/180)); 
    printf("25의제곱근= %.2f\n", sqrt(25)); 
    printf("5의3제곱= %.2f\n", pow(5,3)); 
    printf("5.4의소수버림결과= %f\n", floor(5.4));
    printf("5.4의소수올림결과= %f\n", ceil(5.4)); 
    printf("-5.4의소수버림결과= %f\n", floor(-5.4)); 
    printf("-5.4의소수올림결과= %f\n", ceil(-5.4)); 
    printf("5의절대값= %d\n", abs(5)); 
    printf("-5의절대값= %d\n", abs(-5)); 
    printf("5.4의절대값= %f\n", fabs(5.4)); 
    printf("-5.4의절대값= %f\n", fabs(-5.4)); 
return 0; 
}
Posted by cyj4369
,
문자 함수(ctype.h) 
 
1) 문자 판단 함수 
isalnum(문자): 영문자 또는 숫자인 경우만 참을 리턴 
isalpha(문자): 문자가 영문자인 경우만 참을 리턴 
isdigit(문자): 문자가 숫자인 경우만 참을 리턴 
islower(문자): 문자가 영어 소문자인 경우만 참을 리턴 
isupper(문자): 문자가 영어 대문자인 경우만 참을 리턴 
ispunct(문자): 문자가 기호문자인 경우에만 참을 리턴 
isspace(문자): 문자가 스페이스인 경우에만 참을 리턴 
isascii(int c): c가 ASCII이면 참값을 리턴 
iscntrl(int c): c가 control 문자이면 참값을 리턴 
isprint(int c): c가 인쇄 가능한 문자이면 참값을 리턴 
예제7) 문자 판단 함수 
#include <stdio.h> 
#include <ctype.h> 
int main() 
    char ch = 'A'; 
    if(isalnum(ch)) 
    {    printf("영문자 또는 숫자임\n"); } 
    else 
    { printf("영문자 또는 숫자 아님\n"); } 
 
 

    if(isalpha(ch)) 
    {    printf("영문자임\n"); } 
    else 
    { printf("영문자 아님\n"); } 
 
 

    if(isdigit(ch)) 
    {    printf("숫자임\n"); } 
    else 
    { printf("숫자 아님\n"); } 
 
 

    if(islower(ch)) 
    {    printf("소문자임\n"); } 
    else 
    { printf("소문자 아님\n"); } 
 
 

    if(isupper(ch)) 
    {    printf("대문자임\n"); } 
    else 
    { printf("대문자 아님\n"); } 
 
 

    if(ispunct(ch)) 
    {    printf("기호문자\n"); } 
    else 
    { printf("기호문자 아님\n"); } 
 
 

    if(isspace(ch)) 
    {    printf("스페이스임\n"); } 
    else 
    { printf("스페이스 아님\n"); } 
 
 

    if(isascii(ch)) 
    {    printf("ASCII 문자임\n"); } 
    else 
    { printf("ASCII 문자아님\n"); } 
 
 

    if(iscntrl(ch)) 
    {    printf("제어문임\n"); } 
    else 
    { printf("제어문자 아님\n"); } 
 
 

    if(isprint(ch)) 
    {    printf("프린트 가능\n"); } 
    else 
    { printf("프린트 불가능\n"); } 
return 0; 
}

 
 

 
 

2) 문자 변경 함수 
toascii(char c): 문자를 아스키 코드 값으로 변경 
tolower(char c): c를 소문자로 변환하는 함수 
toupper(char c): c를 대문자로 변환하는 함수 
 
 

예제8) 문자 변경 함수 
#include <stdio.h> 
#include <ctype.h> 
int main() 
    char ch = 'A'; 
    printf("ch의 ASCII 값 %d\n", toascii(ch)); 
    printf("ch를 소문자로 변경\n"); 
    ch = tolower(ch); 
    printf("ch = %c\n", ch); 
    printf("ch를 대문자로 변경\n"); 
    ch = toupper(ch); 
    printf("ch = %c\n", ch); 
return 0; 
}
Posted by cyj4369
,
문자열 함수(string.h) 
 
모든 시간 함수의 원형은 time.h 헤더 파일에 선언되어 있으므로 시간 관련 함수를 사용하려면 반드시 time.h를 인클루드 해야 합니다. 
 
 

char *strcpy( char *strDestination, const char *strSource ); 
Source의 문자열을 Destination에 복사 
char *strncpy( char *strDest, const char *strSource, size_t count ); 
Source의 문자열을 Destination에 n 만큼 복사 
 
 

예제9) strcpy 
#include <stdio.h> 
#include <string.h> 
int main() 
    char str1[20] = "Good"; 
    char str2[20] = "Morning";
    char str3[20]; 
    strcpy(str3, str1); 
    printf("str3 = %s\n", str3); 
    strncpy(str3, str2, 4); 
    printf("str3 = %s\n", str3); 
return 0; 
 
 

}

 
 

char *strcat( char *strDestination, const char *strSource ); 
Source의 문자열을 Destination에 연결 
char *strncat( char *strDest, const char *strSource, size_t count ); 
Source의 문자열을 Destination에 n 만큼 연결 
 
char fruit[80] = "straw";
strcat(fruit, "berry"); 
 




예제10) strcat 
#include <stdio.h> 
#include <string.h> 
int main() 
    char str1[20] = "Good"; 
    char str2[20] = "Morning";
    char str3[20] = "\0"; 
    strcat(str3, str1); 
    printf("str3 = %s\n", str3); 
    strncat(str3, str2,4); 
    printf("str3 = %s\n", str3); 
return 0; 
 
 

}

 
 

int strcmp(const char *string1, const char *string2 ); 
string1과 string2를 비교해서 같으면 0 앞의 문자열이 크면 1 뒤의 문자열이 크면 -1을 반환, 대소문자를 구별함 
int strncmp( const char *string1, const char *string2, size_t count ); 
string1과 string2를 count 만큼 비교해서 같으면 0 앞의 문자열이 크면 1 뒤의 문자열이 크면 -1을 반환, 대소문자를 구별함 
int stricmp( const char *string1, const char *string2 ); 
string1과 string2를 비교해서 같으면 0 앞의 문자열이 크면 1 뒤의 문자열이 크면 -1을 반환, 대소문자를 구별하지 않음 
int _strnicmp( const char *string1, const char *string2, size_t count ); 
string1과 string2를 count 만큼 비교해서 같으면 0 앞의 문자열이 크면 1 뒤의 문자열이 크면 -1을 반환, 대소문자를 구별하지 않음 
 
 

예제11) strcmp 
#include <stdio.h> 
#include <string.h> 
int main() 
    char str1[20] = "Good"; 
    char str2[20] = "Morning"; 
    printf("%d\n", strcmp(str1, str2)); 
    strcpy(str2, "Good Morning"); 
    printf("%d\n", strncmp(str1, str2,4)); 
    strcpy(str2, "good"); 
    printf("%d\n", strcmp(str1, str2)); 
    printf("%d\n", stricmp(str1, str2)); 
    printf("%d\n", strnicmp(str1, str2,4)); 
return 0; 
}

 
 

char *strset( char *string, int c ); 
string 문자열을 c 문자로 채움 
char *strnset( char *string, int c, size_t count ); 
string 문자열 중 count에 해당하는 만큼 c 문자로 변경 
 
 

예제12) strset 
#include <string.h> 
#include <stdio.h> 
int main( ) 
char string[] = "Fill the string with something"; 
printf( "Before: %s\n", string ); 
strset( string, '*' ); 
printf( "After: %s\n", string ); 
strnset( string, '?', 4 ); 
printf( "After: %s\n", string ); 
return 0; 
 
 

}

 
 

strlwr( char *string ); 
string 문자열을 소 
예제13) strs 문자로 변경 
char * strupr( char *string ); 
string 문자열을 대문자로 변경 
size_t strlen( const char *string ); 
string 문자열의 글자 수 반환 
 
 

예제13) strlwr 
#include <string.h> 
#include <stdio.h> 
int main() 
char string[] = "Fill the string with something"; 
int location; 
printf("string의 소문자 %s\n", strlwr(string)); 
printf("string의 대문자 %s\n", strupr(string)); 
printf("string의 메모리 사이즈 %d\n", sizeof(string)); 
printf("string의 문자 수 %d\n", strlen(string)); 
return 0; 
 
 

}

 
 

char * strchr( const char *string, int c ); 
string에서 문자 c의 메모리 위치 반환 
char *strrchr( const char *string, int c ); 
string에서 문자 c의 메모리 위치 반환(뒤에서부터 검색) 
 
 

예제14) strchr를 이용해서 문자열에서 첫 번째 검색 위치를 찾아내는 프로그램 
#include <stdio.h> 
#include <string.h> 
int main() 
    char str[256] = "My name is Park Moon Seok"; 
char *ptr; 
    char ch; 
    int result; 
    while(1) 
    { 
        printf("찾고자 하는 문자를 입력하세요=>"); 
        ch = getchar(); 
        fflush(stdin); 
        printf("1. 앞에서 2. 뒤에서=>"); 
        menu = getchar(); 
        ptr = strchr(str, ch); 
        result = ptr - str + 1; 
 
 

            if(ptr != NULL ) 
            { 
    printf( "Result: 첫번째 %c 발견위치 = 앞에서 %d 번째\n", ch, result ); 
            } 
            else 
            { 
             printf( "Result:%c는 없습니다\n", ch ); 
            } 
    return 0; 
}

strrchr은 뒤에서부터 검색하게 되는데 위치를 리턴 하므로 문자가 하나만 있는 경우는 같은 결과가 나올 것이고 o를 검색하면 다르게 나올 것 입니다. 
예제15) strchr를 이용해서 문자열에서 o의 개수를 알아내는 프로그램 
#include <stdio.h> 
#include <string.h> 
int main() 
char str[256] = "My name is Park Moon Seok"; 
char *ptr = str; 
unsigned int i,count=0; 
for (i=0;i<strlen(str);i++) 
     { 
ptr = strchr(ptr,'M'); 
if (ptr == NULL) 
         { 
break; 
count++; 
         ptr ++; 
printf("입력한 문자열에는 o가 %d개 있습니다.\n",count); 
}

 
 

char *strstr( const char *string, const char *strCharSet ); 
string에서 문자열 strCharSet의 메모리 위치 반환 
strcmp는 전체 일치하는 문자열은 검색할 수 있지만 부분 일치는 알아낼 수 없습니다. 
부분 일치를 찾아 낼 때 사용하는 함수 입니다. 
char *strpbrk( const char *string, const char *strCharSet ); 
string에서 문자열 strCharSet 중 첫 번째 나오는 메모리 위치 반환 
예제16) strstr, strpbrk를 이용해서 문자열에서 문자열을 검색하는 프로그램 
#include <stdio.h> 
#include <string.h> 
int main() 
char str[256] = "My name is Park Moon Seok"; 
char *ptr; 
unsigned int result; 
ptr = strstr(str,"name"); 
         result = ptr - str + 1; 
if(ptr != NULL ) 
            { 
        printf( "Result: name 발견위치 = 앞에서 %d 번째\n", result ); 
            } 
            else 
            { 
             printf( "Result: name은 없습니다\n"); 
            } 
         ptr = strpbrk(str,"xyz"); 
         result = ptr - str + 1; 
if(ptr != NULL ) 
            { 
        printf( "Result: xyz 중 하나 발견위치 = 앞에서 %d 번째\n", result ); 
            } 
            else 
            { 
             printf( "Result: xyz는 없습니다\n"); 
            } 
    return 0; 
}

char *strtok(char *strToken, const char *strDelimit); 
strToken을 strDelimit 단위로 분할해주는 함수 
 
 

예제17) strtok를 이용해서 공백을 기준으로 분할하는 예제 
#include <string.h> 
#include <stdio.h> 
char string[] = "My name is Park Moon Seok"; 
char *token; 
int main( ) 
token = strtok(string," "); 
while( token != NULL ) 
printf( "%s\n", token ); 
     token = strtok(NULL, " "); 
return 0; 
}
Posted by cyj4369
,
난수 함수(stdlib.h) 
 
난수(Random Number)란 무작위로 만들어지는 알 수 없는 값을 말합니다. 
어떤 값을 가지게 될 지 예측할 수 없는 수라는 뜻인데 이런 난수가 필요한 이유는 말 그대로 예측을 허용하지 않기 위해서입니다. 
 
 

int rand(void); 
void srand(unsigned int seed); 
 
 

rand 함수는 0~RAND_MAX 범위의 수 중에서 무작위로 한 수를 생성해 냅니다. 
RAND_MAX는 컴파일러에 따라 다르지만 일반적으로 32767(0x7ffff)로 정의되어 있습니다. 그래서 rand 함수를 호출하면 0부터 32767중의 임의의 정수 하나가 리턴 됩니다. 
 
 

예제2) 5개의 숫자를 랜덤하게 추출해주는 예제 
#include <stdio.h> 
#include <stdlib.h> 
int main() 
    int i; 
    printf("rand()의 결과는 0부터 %d까지의 랜덤한 수\n", RAND_MAX); 
    for(i=0; i<5; i++) 
    { 
        printf("[%d]번째 수: %d\n", i+1, rand()); 
    } 
    return 0; 
}

위의 예제는 5개의 랜덤한 수를 추출하지만 계속 수행해 보면 항상 동일한 결과를 출력합니다. 
rand 함수는 일정한 난수 생성 규칙(seed)에 따라 난수를 생성하는데 난수 생성 규칙이 항상 같기 때문에 난수가 생성되는 순서도 항상 같게 됩니다. 
난수 생성 규칙에 변화를 줄 수 있는 함수가 srand라는 함수입니다. 
srand는 난수 발생기에 난수를 발생시키는 시작점(seed)를 제공하며 난수 발생기는 이 시작점을 기준으로 하여 난수를 발생시키게 됩니다. 
따라서 시작점을 바꾸면 생성되는 난수도 달라집니다. 
즉 srand 함수의 매개변수로 정수 값을 넣어주면 생성되는 숫자가 달라지게 됩니다. 
그러나 이렇게 하더라도 시작점이 동일하면 생성되는 난수에는 일정한 규칙이 존재할 수밖에 없습니다. 
완전한 난수를 만들기 위해서는 난수 생성기에게 전달되는 시작점 또한 예측 불가능한 난수여야 합니다. 
이러한 이유로 시간 값을 시작점으로 사용한다면 완전한 난수를 만들 수 있습니다. 
따라서 위의 예제에 숫자를 추출해 내기 전에 
srand((unsigned)time(NULL)); 문장을 삽입하면 완전한 난수가 추출될 것 입니다. 
 
 

또한 일정한 범위 안의 난수를 추출할 수 도 있습니다. 
가령 1부터 10까지의 난수 추출이라면 
rand() % 10 +1 이렇게 하면 됩니다. 
 
 

예제3) 1부터 100까지 짝수만 5개 추출하는 예제 
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
int main() 
    int i; 
    srand((unsigned)time(NULL)); 
    for(i=0; i<5; i++) 
    { 
        printf("[%d]번째 수: %d\n", i+1, (rand()%50+1)*2); 
    } 
    return 0; 
}
Posted by cyj4369
,