문자 입출력 함수 getchar(), putchar()


콘솔 환경에서 문자를 입력 받고 출력하는 C 함수에 대해서 알아보겠다.

getchar는 문자를 입력 받는 함수 이며 putchar는 반대로 문자를 출력하는 함수 이다.


getchar, putchar 사용법


두 함수를 사용법은 예제를 통해 확인해 보겠다.


#include <stdio.h>


int main()

{

char text=0;


while(text != EOF)

{

text=getchar();

putchar(text);

}


return 0;

}


 실행 결과

 abc

 abc

 test

 test

 ^Z

 계속하려면 아무 키나 누르십시오...


예제를 보면 getchar함수를 통해 사용자가 입력 한 문자를 읽어 온다.

읽어온 문자를 그대로 putchar로 통해 출력해주고 있다.

그리고 입력 된 값이 EOF가 아닐 때까지 위의 두 작업을 계속 반복 한다.


그렇다면 EOF는 무엇인가?

EOF는 실제 가지고 있는 값은 -1이며 오류발생 혹은 파일 끝에 도달 하면 EOF가 출력 된다고 한다.

위의 예문에서는 파일 끝이나 오류를 발생 시키는 방법이 없으니 사용자의 입력을 통해 EOF를 발생시켜야 한다.

EOF를 입력하는 방법은 Ctrl-Z이다.

그래서 실행 결과 마지막에 ^Z가 찍히는 것을 확인 할 수 있다.








반응형

줄바꿈 종류 (LF, CR)


C,C++ 에서 문자열을 처리할 때 줄바꿈을 해야 하는 경우가 있다.

이때 쓰이는것이 라인피드(LF : Line Feed) 와 캐리지리턴(CR: Carriage return) 두 가지가 존재하는데 

각각의 정의와 사용법에 대해서 알아보겠다.


두 종류의 차이와 설명


라인피드(LF : Line Feed) => 현재 위치에서 바로 아래로 이동

캐리지리턴(CR: Carriage return) => 커서의 위치를 앞으로 이동

[각 사용법]

printf("Line Feed \n");

printf("Carriage Retrun \r");


위와 같이 라인피트는 \n을 사용하며 캐리지 리턴은 \r을 사용한다. 

아래 예제를 보면서 이해를 돕도록 하겠다.


[ Carriage Return 예제 ]

...

int main(void)

{

    printf("test\r");

    printf("1004");

}


 실행 결과

 1004


[ Line Feed 예제 ]

...

int main(void)

{

    printf("test\n");

    printf("1004");

}


 실행 결과

 test

 1004





운영체제 마다 줄바꿈 정의



운영체제 마다 줄바꿈 정의가 다르다. 

각 운영체제 마다 정의를 살펴 보자.


윈도우/DOS : CRLF 조합으로 줄바꿈을 정의

Unix/Linux/C : LF 만으로 줄바꿈을 정의


이래서 윈도우에서 작성 된 것을 Unix/Linux 계열로 올리면 vi로 편집했을 때 ^M이 붙는 것을 확인 할 수 있다.

물론 ftp로 올릴 때 방식이 텍스트/2진 어떤 것을 선택하느냐에 따라 달라질 수 있다.

텍스트 방식으로 올리면 데이터 변환이 생겨 /r/n -> /n 으로 된다. 

2진 모드로 올릴때는 변환이 생기지 않아 윈도우에서 작성된 파일이 컴파일이 안되거나 script작성 된것이 동작 안할 수가 있다.


[sftp 전송 방식]

텍스트 방식 : 줄바꿈에 대한 변환이 일어남

2진 모드 : 줄바굼에 대한 변환이 일어나지 않음 ( 문제가 발생할 수 있다. )


반응형

'프로그램 > C' 카테고리의 다른 글

[C] 문자열 단위 입출력 함수 gets(), puts()  (0) 2017.10.01
[C] 문자 입출력 함수 getchar(), putchar()  (0) 2017.09.29
[C] 구조체 배열과 포인터  (0) 2017.07.31
[C] 구조체  (0) 2017.07.24
[C] 포인터와 상수(const)  (0) 2017.07.23

이클립스(Eclipse) 최적화 방법


Eclipse는 자원을 많이 차지하는 무거운 툴이다.

컴퓨터의 사양이 좋다면 많은 문제가 없겠지만 여러개의 프로그램이 실행 되고 사양도 좋지 않다면

툴을 사용하는데 어려움을 겪을 수가 있다.

이클립스 최적화를 통해 CPU, 메모리 사용량을 줄일 수 있는 방법과

개발하는데 많이 사용되는 설정 값을 공유 하겠다.



이클립스 최적화remote system explorer operation


 순번

 작업 명

 방법

 1

 자동 빌드 해제


 Project -> Build Automatically체크를 해제 한다.

 Project -> Build ALL  혹은  Ctrl + B 를 통해 수동으로 가능


 2

 소스 자동 폴딩 해제


 Preferences > Java > Editor > Folding -> Enable folding 체크 해제


 3

 코드 자동완성기능 해제

 

 Preferences > Java > Editor > Content Assist 에서 Auto Activation - Enable auto activation 해제 

 ctrl+space를 사용해서 수동으로 가능


 4 하단에 메모리 사용 상태 표시 
 Preferences > General 에서 Show heap status 체크

 5

 스펠링 체크 해제

 

 Preferences > General > Editors > Text Editors > Spelling 에서 Enable spell checking 해제


 6

 이클립스 실행 속도 개선


 Windows -> Perferences -> General -> Startup and Shutdown 에서 필요 없는 것 제외

예를 들어 RSE 같은 경우 원격 프로젝트를 관리하는 기능 인데 필요가 없다며 꺼둔다.


 7

 Validation 유효성 체크 해제

 

 Preferences > Validation에서 필요 없는 것 제외


 8

 Autometic Update Off

 

 Preferences > Install/Updates > Automatic Updates 에서 체크해제



도움이 되었나요?




반응형

구조체 배열과 포인터


사용자가 정의한 자료형인 구조체를 이용한 배열, 포인터 선언 및 사용 방법에 대해 알아보겠다.

구조체도 자료형이기 때문에 배열과 포인터 사용이 가능 하며 일반 변수와는 조금 다르게 맴버 접근 연산자를 통해

구조체의 맴버 변수를 접근 하는 방법을 잘 봐두길 바란다.


구조체 배열


구조체의 배열을 선언하는 방법은 아래와 같다.

struct human person[3];


구조체 배열을 사용 하는 방법은 아래와 같다.

...

int main(void)

{

    ...

    preson[0].age = 10;

    ....

    printf(" %s is %d year old \n", person[0].name, person[0].age );

    ....

}


위와 같이 3개의 배열중 어떤 값을 접근 할 지 정하는 배열 위치 person[0] .. [2] 위치 그리고 각 배열 구조체의 맴버 변수를 

접근하는 person[0].name ... person[0].age ( 맴버 연산자 혹은 맴버 접근 연산자 ) 가 있다.



구조체 포인터


구조체 포인터를 사용 하는 방법은 아래와 같다.

...

int main(void)

{

    ...

    pPerson = &person[0];

    pPerson->age = 13;

    strcpy( pPerson->name, "sujan" );

    printf(" %s is %d year old \n", pPerson->name, pPerson->age );

    ....

}


위와 같이 구조체의 포인터에 해당 구조체 값이 있는 변수의 주소를 연결 시켜 준다.

포인터 구조체의 맴버 변수를 접근하는 person->name ... person->age ( 맴버 연산자 혹은 맴버 접근 연산자 ) 가 있다.


 일반 구조체 맴버 연산자

 포인터 구조체 맴버 연산자

 .

 ->

 EX) car.speed = 90 ;

 EX) pCar->speed = 90;






구조체 정의 및 선언, 사용방법 내용이 담긴 소스를 보면서 마무리 하겠다.

#include <stdio.h>

#include <string.h>


struct human

{

    char name[50];  // 이름

    int  age;       // 나이

};


int main()

{

struct human person[3];

struct human *pPerson = NULL;


person[0].age = 10;

person[1].age = 11;

person[2].age = 12;


memset( &person[0].name, 0x00, sizeof(person[0].name) ); // 이름 변수 초기화

memset( &person[1].name, 0x00, sizeof(person[1].name) ); // 이름 변수 초기화

memset( &person[2].name, 0x00, sizeof(person[1].name) ); // 이름 변수 초기화


strcpy( person[0].name, "jack" );

strcpy( person[1].name, "mike" );

strcpy( person[2].name, "call" );

printf("\n===========================배열 접근=========================\n");

printf(" %s is %d year old \n", person[0].name, person[0].age );

printf(" %s is %d year old \n", person[1].name, person[1].age );

printf(" %s is %d year old \n", person[2].name, person[2].age );


printf("\n===========================포인터 접근=========================\n");

pPerson = &person[0];

pPerson->age = 13;

strcpy( pPerson->name, "sujan" );

printf(" %s is %d year old \n", pPerson->name, pPerson->age );

pPerson = &person[1];

printf(" %s is %d year old \n", pPerson->name, pPerson->age );

pPerson = &person[2];

printf(" %s is %d year old \n\n", pPerson->name, pPerson->age );

}



반응형

+ Recent posts