여기서는 printf( )와 scanf( )에 대해 자세히 설명한다.
문자열이란?
하나 또는 여러 개의 문자들이 연속되어 있는 것을 말한다.
배열이란?
연속되어 있는 여러 개의 메모리 셀
동일한 데이터형을 가진 여러 데이터 원소들이 메모리에 순서대로 나열되어 있는 연속물
아래 그림에서 각괄호([ ])에 의해 그것을 배열로 인식한다.
char name[40];
C는 문자열을 위한 어떤 특별한 데이터형을 제공하지 않는다.
- C는 char형 배열에 문자열을 저장한다.
- 이때, 각각의 셀은 1바이트다.
- 배열의 마지막 위치에 문자는 널 문자(null character)이다.
- 저장할 문자들의 수보다 셀의 수가 최소한 하나 더 많아야 한다.
sizeof( ) 와 srtlen( )은 %zd 지정자를 사용한다.
sizeof( )를 사용할 때 괄호의 사용 여부는, 데이터형의 크기를 원하느냐, 데이터의 양에 대한 크기를 원하느냐에 달려 있다.
상수와 C 전처리기
circumference = 3.141592 * diameter;
위와 같이, 실제의 값을 그대로 타이핑할 수도 있지만 아래와 같이 기호상수(symbolic constant)를 사용할 수도 있다.
circumference = pi * diameter;
기호 상수를 사용하면 좋은 점.
1. 이름이 수보다 더 많은 것을 알려준다.
2. 여러 곳에서 사용한 경우 기호 상수의 정의만 바꾸면 된다.
owed = 0.015 * housevalue;
owed = taxrate * housevalue;
기호 상수의 사용법.
1. 변수를 선언하고 그 변수를 원하는 상수와 같게 설정한다.
float taxrate;
taxrate = 0.015;
※ 아래는 C가 제공하는 방법이다
2. C 전처리기 #define이다.
#define TAXRATE 0.015
프로그램이 컴파일 될 때, TAXRATE가 사용된 모든 곳이 값 0.015로 대체된다.
이를 컴파일 시간 대체(compile-time substitution)라 부른다.
위를 사용하여 정의된 상수들을 명단 상수(manifest constant)라고 부른다.
※ 명단상수명 규칙
명단상수명을 대문자로 하는 이유는 C의 전통으로 변수와 구분하여 코드를 쉽게 읽기 위함이다.
대문자로 표기하지 않아도 프로그램은 동작한다.
#define 지시자를 사용할 때 문자 상수에는 작은 따옴표, 문자열 상수에는 큰 따옴표를 사용한다.
3. const 변경자
const 키워드를 사용하여 변수 선언을 상수 선언으로 변환 할 수 있다.
const int MONUHS = 12;
이것은 MONTHS를 읽기 전용 값으로 만든다.
명단 상수의 사용
C의 헤더 파일, limits.h와 float.h는 정수형과 부동소수점형의 크기 제한에 관련된 정보를 제공한다.
printf()는 출력함수이고 scanf()는 입력함수이지만, 둘이 비슷하게 동작한다. 즉, 둘 다 하나의 포맷 문자열과 전달인자 리스트를 사용한다.
다음 이들의 동작에 대해 알아본다.
printf( ) 함수
printf( )를 사용하는 형식
printf(Control-string, item1, item2, ...);
item1, item2등은 출력할 항목이다.
control-string은 그 항목들을 어떤 포맷으로 출력할 것인지를 지정하는 문자열이다.
control-string은 큰 따옴표 안에 들어 있는 문구이다.
printf( ) 플래그
printf( )의 리턴 값
일반적으로 C의 함수는 하나의 리턴값을 가진다.
이것은 함수가 계산하여 자신을 호출한 프로그램에 리턴하는 값이다.
printf( )함수는 자신이 출력할 문자의 수를 리턴한다.
이 printf( ) 함수의 한 가지 용도는 출력 에러를 확인하는 것이다.
또한, 정보를 출력하는 것과 어떤 값을 변수에 대입하는 것을 볼수 있다.
scanf( )의 사용
문자열의 문자 하나하나를 수치값으로 변환하는 것이 scanf( )가 하는 일이다.
printf( )과 마찬가지로, scanf( )도 포맷 문자열과, 그 뒤를 따르는 전달인자 리스트를 사용한다.
printf( )와 scanf의 차이점
전달인자 리스트에 있다.
printf( ) 함수는 변수 이름, 상수, 수식을 사용한다.
scanf( ) 함수는 변수를 가리키는 포인터를 사용한다.
- scanf( )를 사용하여 기본 데이터형의 값을 읽는다면, 변수 이름 앞에 & 기호를 사용한다.
- scanf( )를 사용하여 문자열을 읽어 문자 배열 안에 넣을때는 & 기호를 사용하지 않는다.
scanf( )는 개별적인 필드들로 나누기 위해 화이트스페이스를 사용한다.
다만, %c 지정자는 이 규칙의 적용을 받지 않고 화이트스페이스라 할지라도 문자를 읽는다.
printf( ) 함수는 float형과 double형 모두에 %f, %e, %E, %g, %G를 사용하지만,
scanf( ) 함수는 float형에 대해서만 이들을 사용하고 double형에 대해서는 ' L '변경자를 요구한다.
scanf( )의 리턴값
scanf( )함수는 읽은 항목의 수를 리턴한다.
printf( )와 scanf( )에서의 * 변경자
printf( )와 scanf( )는 둘다 * 변경자를 사용하여 지정자의 의미를 변경 시킬 수 있다.
printf( )는 필드 너비를 사용자가 미리 지정하지 않고, 프로그램이 알아서 지정하게 만들어 준다.
scanf( )는 %지정자와 문자 사이에 *를 넣으면 그에 해당하는 입력을 건너 뛴다.