검색결과 리스트
2011/02/22에 해당되는 글 7건
- 2011.02.22 표준입출력함수 getchar() / putchar()
- 2011.02.22 비표준 입출력함수 getch(), getche()
- 2011.02.22 표준입출력함수 printf() / scanf()
- 2011.02.22 음수의 표현
- 2011.02.22 C 언어 학습에 핵심. 변수와 상수
- 2011.02.22 C 프로그램 실행과정
- 2011.02.22 C 언어란?
글
표준입출력함수 getchar() / putchar()
입출력함수의 동작방식
프로그램이 실행되기 전(main함수로 진입되기 전) 운영체제는 그 프로그램을 위해 입출력 버퍼를 생성한다.
생성된 입출력 버퍼에 대한 접근을 위해 <stdio.h>에 표준입력 버퍼를 위해 stdin을, 표준출력 버퍼를 위해
stdout 등의 값을 정의해두었고, 프로그래머는 이 값에 접근함으로 표준입출력 버퍼를 다룰 수가 있다.
int ch; ch = getchar(); putchar(ch);
위 소스 코드가 실행되면, 먼저 1바이트의 메모리가 생성이 되고, ch라는 이름이 부여된다.
getchar() 함수가 실행이 되고, 표준입력버퍼가 비어있기 때문에, 커서가 깜박이게 된다.
사용자가 abc값을 입력하면, 이 값은 입력버퍼에 쌓이게 된다. 엔터를 치면, 개행문자까지 버퍼에 입력이 되고,
이 버퍼에서 한문자가 읽혀져 getchar에 반환된다.
stdin : a b c \n <= 개행문자가 입력되는 순간 getchar 함수가 문자 a를 반환함
getchar 함수에 의해 문자 'a' 의 정수값 97이 반환이 되고, puchar(ch)는 이값을 출력버퍼에 쓰고 동시에 버퍼를 비우게 되고,
비로소 모니터에 출력이 되게 된다.
중요한 것은 입출력 버퍼에 데이터를 기록하고 읽어온다는 것과 개행문자까지 버퍼에 함께 기록되기 때문에 동작방식을
잘 이해해야 한다는 것이다.
표준입력함수
int getchar();
표준입력버퍼에서 1문자를 읽어 정수값을 반환하는 함수.
표준 출력함수
int putchar(int ch);
표준출력버퍼에 1문자를 쓰고, 버퍼를 비우는 함수
기억해 두면 유용한 아스키값
- 'A' : 65
- 'a' : 97
- '0' : 48
'\n' : 10
이 글은 스프링노트에서 작성되었습니다.
'언어로그 > C/C++' 카테고리의 다른 글
| 포인터의 이해 (0) | 2011.03.11 |
|---|---|
| 매크로, 연산자 (3) | 2011.03.10 |
| 표준입출력함수 getchar() / putchar() (0) | 2011.02.22 |
| 비표준 입출력함수 getch(), getche() (0) | 2011.02.22 |
| 표준입출력함수 printf() / scanf() (0) | 2011.02.22 |
| 음수의 표현 (0) | 2011.02.22 |
설정
트랙백
댓글
글
비표준 입출력함수 getch(), getche()
getch(), getche()는 입출력버퍼를 거치지 않는 비표준 입출력함수로 <conio.h> 헤더파일에
선언되어 있다. 표준이 아니기 때문에 시스템마다 함수 지원여부가 다를 수 있지만 대다수 시스템에서
지원한다고 한다
- int getch(void)
표준입력(키보드)로부터 1문자를 읽어오는 함수로, 버퍼에서 읽지 않고 바로 읽어온다.
- int getche(void)
getche 는 getch 와 동일한 기능을 하지만, 읽은 1문자를 바로 echo해 준다.
escape(이스케이프 문자)
- '\a' :beep sound
- '\t' : tab
- '\b' : back space
- '\0' : null character (아스키 코드값 0)
- ...
이 글은 스프링노트에서 작성되었습니다.
'언어로그 > C/C++' 카테고리의 다른 글
| 매크로, 연산자 (3) | 2011.03.10 |
|---|---|
| 표준입출력함수 getchar() / putchar() (0) | 2011.02.22 |
| 비표준 입출력함수 getch(), getche() (0) | 2011.02.22 |
| 표준입출력함수 printf() / scanf() (0) | 2011.02.22 |
| 음수의 표현 (0) | 2011.02.22 |
| C 언어 학습에 핵심. 변수와 상수 (0) | 2011.02.22 |
설정
트랙백
댓글
글
표준입출력함수 printf() / scanf()
printf 와 scanf 는 포맷에 맞추어, 표준 입출력을 수행하는 함수, 이 함수들도 표준입출력 버퍼의
데이터를 다루는 함수들이다. printf 와 scanf 함수에 인자로 적절한 포맷을 지정하는 변환코드를
지정해 줄 수 있다.
변환코드
%c : 문자
%d : 정수
%f : 실수(단정도 - float)%lf : 실수(배정도 - double)
printf 함수에 변환코드를 좀더 세부적으로 표현해줄 수 있다.
printf 함수에 %nd (n은 양수) 은 최소 n 자리를 확보하라는 뜻이다.
int a = 12345;a값을 다음과 같은 변환코드에 적용을 하면
- %8d : 최소 8자리를 확보하여 출력한다. >> _ _ _ 1 2 3 4 5 가 출력됨.
- %3d : 최소 3자리를 확보하지만, 더 큰자리수를 표현할수 잇다. >> 12345
- %08d : 최소 8자리를 확보하되, 빈칸은 0으로 표시한다. >> 0 0 0 1 2 3 4 5
- %-8d : 최소 8자리를 확보하되, 왼쪽칸 부터 채운다. >> 1 2 3 4 5 _ _ _
실수는 디폴트로 소수 6자리까지 표시를 한다.
double d = 123. 456
에 변환코드를 적용해보면,
- %f :디폴트로 소수 6번째 자리까지 표시한다. >> 1 2 3 . 4 5 6 0 0 0
- %8.2f : 최소 8자리를 출력하되, 소수 2째 자리까지 표시 >> _ _ 1 2 3 . 4 6
%08.2f : 최소 8자리 중, 소수 2째자리까지 표시하고 빈칸은 0으로 채움 >> 0 0 1 2 3 . 4 6 -
%.2f : 소수 2째자리까지 표시하고, 최소 자리수는 알아서 출력 >> 1 2 3 . 4 6
- %o : 8진수로 표현
%0x : 16진수로 표현 - %% : % 문자 자체 출력
- % s : 문자열 출력
정수를 8진수 16진수로 표현하기
8진수 1자리수는 2진수 3비트에 해당하며, 16진수 1자리는 2진수 4비트에 해당한다.
int a = o73;
8진수 73을 2진수로 표현을 하면 0111 0011 로 표현할 수 있다.
int b = 0xf4;
16진수 64를 2진수로 표현하면 1111 0100 로 표현할 수 있다.
scanf
Scanf : 표준 입력버퍼에서 지정한 서식에 맞게 읽어오는 함수로, 값을 저정할 메모리의 정확한 물리적인 주소를
전달해야 한다. 통상 주소 연산자 &(엠퍼센트) 를 변수 앞에 두어 변수의 주소를 전달한다.
1234 (천이백삼십사) 라는 값을 입력받고 싶은 경우, getchar() 함수는 한 문자를 반환하기 때문에
네 문자를 읽어서 적절한 정수형태로 변환을 해주어야 한다. 이러한 과정은 어렵진 않지만 번거로운 작업으로
scanf 를 사용하여 편리하게 읽어올 수 있다.
int a;
scanf("%d", &a);
위 코드를 실행하여 1234를 입력했다고 가정하면, sscanf
whitespace(공백, 탭, 엔터)를 만날 때까지 값을 읽어들이고, 변환코드에 지정한 형식으로 자동으로 변환하여
변수에 값을 담아준다.
scanf 에서의 변화코드
scanf("%3d", &a);
scanf에서 변환코드는 printf 와는 다르게, whitespace가 나올 때까지 읽되, 최대 3문자까지만 읽어들인다는 의미이다.
즉 whitespace가 나오지 않더라도, 3문자까지 읽으면 더이상 버퍼에서 읽지 않는다는 것이다.
scanf 에 변환코드를 여러개 주어 한번에 여러값을 읽어들일 수 있다.
char ch;
int a;
float f;
double d;
scanf("%c %d %f %d", &ch, &a, &f, &d);
scanf 사용시 주의사항
1) printf 에서는 float와 double형 데이터를 위해 %f 변환코드를 사용할 수 있었지만, scanf에서는
반드시 float는 %f, double은 %lf 변환코드를 사용하여야 한다.2) %c 를 제외한 변환코드는 whitespace가 나올때까지 읽지만, %c는 whitespace 문자가 나올때까지 읽지만
whitespace를 버퍼에 제거하지 않고 남겨두어 이후 오작동에 원인이 될수 있다. %c를 사용한 후 fflush(stdin)를사용하여 버퍼를 비워주는 것이 좋다.
3) scanf("%d \n" , &a) 나 scanf("%d ", &a); 와 같이 변환코드 다음에 다른 문자가 있으면, 다른 변환코드가 있을거라가정하여 의도하지 않게 2번 입력해야 하는 경우가 발생하기 때문 포맷문자열에는 변환코드만을 사용한다.
이 글은 스프링노트에서 작성되었습니다.
'언어로그 > C/C++' 카테고리의 다른 글
| 표준입출력함수 getchar() / putchar() (0) | 2011.02.22 |
|---|---|
| 비표준 입출력함수 getch(), getche() (0) | 2011.02.22 |
| 표준입출력함수 printf() / scanf() (0) | 2011.02.22 |
| 음수의 표현 (0) | 2011.02.22 |
| C 언어 학습에 핵심. 변수와 상수 (0) | 2011.02.22 |
| C 프로그램 실행과정 (0) | 2011.02.22 |
설정
트랙백
댓글
글
음수의 표현
컴퓨터에서는 모든 데이터를 이진수로 다룬다. 그러다 보니 음수를 어떻게 이진수로
표현을 해야하는가에 대한 문제가 생기게 됐다. 가장 단순하게 음수를 표현하는 방법으로
부호화비트 표현법이 있다. 가장 상위비트를 부호비트로 표현하여 부호비트가 0이면 양수,
1이면 음수로 표현하는 방법이다. 하지만 두 수를 연산하는데 문제가 생기게 되는데...
(4비트로 이뤄진 수중에 첫번째 비트가 부호비트라고 가정해보자)
+ 5 => 0101
- 5 => 1101: 부호화 비트 표현
와 같이 +5는 0101, -5는 부호비트만 바꾼 1010 으로 표현이 된다.
하지만 두 값을 더한 값은 0이 되야 하지만 결과는 0010 (2)가 되어 잘못된 결과가 나오게 된다.
그래서 다른 이진수 음수 표현법이 필요하게 됐고, 1의 보수표현법, 2의 보수표현법이 생겨나게 됐다.
1의 보수표현법은 음수를, 절대값의 이진수 표현에서 각 비트를 역전시킨 값을 음수로 나타낸다.
+ 5 => 0101
- 5 => 1010 : 1의 보수 표현
두 값 0101과 1010을 더하면 결과는 1111 이 나온다. 음수를 1의 보수로 변경했기 때문에
다시 결과를 1의 보수로 취해주면 결과는 0000이 되어 올바른 결과가 나온다.
그럼 2의 보수 표현법을 알아보자. 2의 보수 표현법은 1의 보수표현법에 1을 더한 값이다
+ 5=> 0101
- 5=> 1011: 2의 보수 표현
두 값 0101 과 1011 을 더하면 10000이 나오고, 4비트 표현이기 때문에 최상위 1비트를 버리면,
결과가 0으로 올바른 값이 나온다.
2의 보수표현법은 1의 보수 표현법보다 속도가 더 빠르기 때문에 (총 n비트라면 1의 보수표현법은 2n번의 비트 역전을,
2의 보수표현법은 1n + 1 번의 비트 역전을 수행한다.) 컴퓨터에서 음수를 표현하기 위해 2의 보수표현법이 선택되었다.
'언어로그 > C/C++' 카테고리의 다른 글
| 비표준 입출력함수 getch(), getche() (0) | 2011.02.22 |
|---|---|
| 표준입출력함수 printf() / scanf() (0) | 2011.02.22 |
| 음수의 표현 (0) | 2011.02.22 |
| C 언어 학습에 핵심. 변수와 상수 (0) | 2011.02.22 |
| C 프로그램 실행과정 (0) | 2011.02.22 |
| C 언어란? (0) | 2011.02.22 |
설정
트랙백
댓글
글
C 언어 학습에 핵심. 변수와 상수
C언어를 학습하는데 있어서 중요한 요소는
- 운영체제에게 어떻게 메모리를 확보해서 쓸 것인가?
- 프로그램을 어떻게 효율적으로 작성할 것인가?
- 어떻게 파일을 모듈화 할 것인가?
C언어는 빠른 실행속도를 장점으로 하는 언어이다. java 언어와 같은 객체지향 언어는 그 나름대로의
장점을 가지고 있지만, 낮은 성능과 제약된 자원을 갖는 시스템 혹은 빠른 속도를 필요로 하는 프로그램에
적합한 언어이다. 직접적으로 메모리에 접근할 수 있기 때문에 빠른 속도를 낼 수 있는 만큼, 메모리를 얼마나
잘 다루느냐가 C언어 프로그래밍의 중요한 화두이다. 효율적인 프로그래밍은 C언어 자체뿐 아니 컴퓨터에 대한
구조를 정확히 이해하고 있을 때 이루어질 수 있다. 효율적인 프로그램을 작성하는 것 만큼, 중요한 것이
어떻게 구조적으로 프로그램을 작성하는냐 이다. 요즘과 같은 규모가 대형화된 프로젝트에서는 프로그램에 대한
복잡도 감소와 관리를 용이하게 하는 것이 비용 절감에 중요한 요소이다.
변수의 선언 , 상수?
변수란 프로그램에서 사용할 데이터를 담을 메모리 혹은 그릇을 의미하며, 변수를 선언한다는 것은
이러한 메모리를 생성한다는 것을 의미한다. 변수 의미 자체는 '변하는 수' 로 이 메모리는 운영체제의 의해
할당되지만, 사용은 사용자가 하기 때문에 그 데이터가 변할 수 있다. 반면 상수는 운영체제가 메모리에 대한
제어권을 가지고 있어서 사용자에 의해 변경될 수 없는 메모리 혹은 데이터를 의미한다.
int a;
다음과 같은 문장은 정수형 데이터를 저장할 수 있는 4바이트의 메모리 공간을 할당하고, 그 메모리 공간을
a 라는 이름으로 접근하겠다고 운영체제에 말하는 것이다.
변수의 타입
변수의 타입에는 정수형, 실수형, 문자형 등... 다양한 타입들이 존재한다. 하지만 운영체제 입장에서 이것들은
수치값을 저장할 수 있는 크기가 다른 메모리 블럭에 해당할 뿐이다. 프로그래머들이 좀더 용이하게 프로그램을 작성할 수 있게
실세계에서 다루는 데이터의 유형을 나누고, 크기를 부여하고, 다르게 해석하도록 컴파일러에게 장치를 한 것이다.
변환코드
char ch = 'A';
printf("%d %c", ch, ch);
위의 문장을 실행하면 65 'A' 라는 결과가 나온다.
먼저 char 형은 문자를 저장하기 위한 1바이트 크기의 데이터 타입이다. 자주 사용하는 문자들의 표를 구성하고, 각 문자에 해당
하는 숫자(ASCII 코드)를 부여했다. char 형은 사실 작은 범위를 수를 저장할 수 있는 정수형과 다름이 없다.
%d , %c는 변환코드라 부르며, 우측에 일치하는 쌍의 값이 어떻게 해석되야 하는지를 나타낸다. %d를 decimal, %c는 character를
의미하며 이 변환코드에 의해 'A' 라는 값이 65라는 정수(아스키값)로 혹은 문자 'A'로 해석이 되었다.
'언어로그 > C/C++' 카테고리의 다른 글
| 표준입출력함수 printf() / scanf() (0) | 2011.02.22 |
|---|---|
| 음수의 표현 (0) | 2011.02.22 |
| C 언어 학습에 핵심. 변수와 상수 (0) | 2011.02.22 |
| C 프로그램 실행과정 (0) | 2011.02.22 |
| C 언어란? (0) | 2011.02.22 |
| 비트필드 (0) | 2010.12.10 |
설정
트랙백
댓글
글
C 프로그램 실행과정
C프로그램 컴파일 - 실행
C언어로 작성된 프로그램은 .c 라는 확장자를 갖는다. 이를 소스파일이라 부르며 이 소스파일이
실행파일로 최종적으로 변환이 된다. 소스파일은 먼저 전처리기(preprocess)에 의해 읽혀지어, 컴파일 전에
특정한 작업이 수행된다. (소스 일부분이 삽입되거나 대체되는 것 같은...) 전처리기에 의해 읽혀진 컴파일러에 의해
머신에 맞는 기계어 (혹은 어셈블리어)로 변환이 되어 목적파일을 생성하게 된다. 이 목적파일은 링커에 의해
해당 프로그램에서 참조하고 있는 파일들을 삽입하여 완전한 실행파일을 생성하게 된다.
실행파일은 사용자가 실행을 하는 순간 운영체제에서 지원하는 Loader(적재기)에 의해 메모리가 올라가 실행되게 된다.
소스파일(.c) > [Preprocessor, Translator] > 목적파일 (.o) > [Linker] > 실행파일(.exe) > [Loader]
이와 같이 C 프로그램이 생성되는 코딩, 디버깅, 컴파일, 배포 과정을 통일된 하나의 툴에서 제공해주는
프로그램이 IDE(통합개발환경)이다. 대표적인 IDE로 Visual Studio 가 있다.
Visual Studio6.0 단축키
컴파일 : Ctrl + F7
실 행: Ctrl + F5
코드정렬 : Alt + F8
에러메시지 : F4
다음은 컨솔에 "Hello world!" 라는 문구를 출려가는 프로그램이다
#include <stdio.h> // 표준 입출력 라이브러리를 사용하겠음
int main() // 프로그램 시작점
{
printf("Hello world!\n"); // 표준 출력에 문자열 출력
return 0;
}
#이 붙어 있는 명령을 전처리 지시자 라고 한다. 컴파일전에 전처리기에 의해 소스파일에 특정한 작업을
수행하는 명령이다. 위에서는 표준입출력 라이브러리를 사용하겠다고 알리고, 표준출력(컨솔)에 출력하는
printf 라는 함수를 사용하였다. main은 C 프로그램에서 항상 시작점이 되는 함수로, 운영체제에 의해 처음으로
읽혀질 메모리 주소를 나타낸다.
'언어로그 > C/C++' 카테고리의 다른 글
| 음수의 표현 (0) | 2011.02.22 |
|---|---|
| C 언어 학습에 핵심. 변수와 상수 (0) | 2011.02.22 |
| C 프로그램 실행과정 (0) | 2011.02.22 |
| C 언어란? (0) | 2011.02.22 |
| 비트필드 (0) | 2010.12.10 |
| 함수의 이해 / 데이터 전달 (0) | 2010.12.10 |
설정
트랙백
댓글
글
C 언어란?
컴퓨터를 동작시키기 위해서는 컴퓨터가 이해할 수 있는 언어로 프로그램을 작성해야 한다.
컴퓨터가 이해할 수 있는 언어가 0과 1의 조합으로 이루어진 기계어이다. 하지만 기계어는
컴퓨터가 잘 이해할 수 있을지는 몰라도, 결국 프로그램을 작성하는 사람이 이해하기에는 너무
어렸다는 단점을 가지고 있다. 특정 기계어 명령에 심볼로 대체하여 좀더 가독성이 좋은 형태로 만든것이
어셈블리어이다. 하지만 이 이 어셈블리어는 Intel, AMD 등 컴퓨터 CPU 머신마다 서로 달라, 각 머신맞게
프로그램을 재작성해야 하는 문제가 생기게 된다. 이러한 문제점을 극복하고자 탄생한 언어가 C 언어이다.
C 언어는 Bell 연구소에서 B언어를 기반으로 데니스 리치에 의해 생겨났다.
C언어가 생겨남으로 소스수준에서의 독립성을 가지게 되었다. C언어를 사용하여 프로그램을 작성하면,
다른 머신에서도 (컴파일러에 의해) 각 머신에 맞는 실행파일을 생성할 수 있게 되었다.
C언어가 널리쓰이게 되면서, 다양한 버전들이 생겨나게 됐다. 호환성 문제가 대두되어, C언어를 표준화하고자
하는 움직임이 생기게 되었다. 1989년 미국 규격협회(ANSI) 에서 표준화된를 승인하게 됐다.(ANSI C라고 함 : C89)
90년에는 국제 표준화 기구(ISO)에 의해 ANSI C가 표준으로 채택되었다. (ISO C 또는 표준C : C90)
이후 C++와 유니코드의 발전 등을 수용하기 위한 C99 등이 생겨나게 되었다.
(이 블로그에서는 표준C 를 기초로 함)
'언어로그 > C/C++' 카테고리의 다른 글
| C 언어 학습에 핵심. 변수와 상수 (0) | 2011.02.22 |
|---|---|
| C 프로그램 실행과정 (0) | 2011.02.22 |
| C 언어란? (0) | 2011.02.22 |
| 비트필드 (0) | 2010.12.10 |
| 함수의 이해 / 데이터 전달 (0) | 2010.12.10 |
| 과제 #3 함수, 포인터의 사용 (0) | 2010.12.10 |