문자 입출력 함수 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

구조체 배열과 포인터


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

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

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


구조체 배열


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

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 );

}



반응형

구조체


하나 이상의 변수를 그룹화 하여 새로운 자료형을 정의 하는 것을 구조체라 한다.

구조체 안에 변수는 int, char, 배열, 포인터, 또다른 구조체등 어떤 것이든 상관없다.



구조체 정의/선언 방법


사람이라는 구조체를 정의 해보자.

구조체 안에 담아야 할 변수는 이름과, 나이 두가지만 정의 해보도록 하겠다.

struct human

{

    char name[50];  // 이름

    int  age;       // 나이

};


구조체가 위와 같이 정의 되었으니 선언해서 사용할 준비를 해보자.


...

int main(void)

{

    struct human jack, mike;

    ...

    return 0;

}


위와같이 human 구조체를 jack, mike 라는 변수 선언을 하므로써 구조체 사용 준비가 완료 되었다.

아래는 구조체 정의와 동시에 선언 방법을 알아보겠다.


struct human

{

    char name[50];  // 이름

    int  age;       // 나이

} jack, mike;



구조체 변수 사용 방법


구조체 선언 변수 jack에 있는 name과 age 값은 어떻게 접근 가능 할까?

jack.age = 10;


jack 뒤에 . 을 붙인뒤 구조체 안에 정의 되어 있는 변수 age를 접근 했다.

. 를 '멤버 연산자' 혹은 '맴버 접근 연산자'라고 부른다.




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

#include <stdio.h>

#include <string.h>


struct human

{

    char name[50];  // 이름

    int  age;       // 나이

};


int main()

{

struct human jack, mike;


jack.age = 10;

mike.age = 11;


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

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


strcpy( jack.name, "jack" );

strcpy( mike.name, "mike" );


printf(" %s is %d year old \n", jack.name, jack.age );

printf(" %s is %d year old \n", mike.name, mike.age );

}


반응형

+ Recent posts