01. 기초문법 – printf함수
개요
ㅇ 출력함수로 표준 출력파일에 문자열 출력
ㅇ 약속된 형식에 맞게 다양한 자료형을 문자열로 변호나한 결과를 화면에 출력합니다. 형식화된출력이라고 얘기하는 부분으로 printf라는 이름은 print formatted string의 약자입니다.
ㅇ 여타 함수와 달리 매개변수의 개수를 마음대로 지정할수 있습니다.
설명
ㅇ 선언
int printf(const char *format [, argument]…);
ㅇ 헤더파일
stdio.h
ㅇ 반환값 : 성공하면 출력한 문자들의 개수, 실패하면 음수의 값 반환
상세
%[flags][width][.precision]type
1. 형식 문자열에 사용하는 형식은 출력 할 값에 대해 각각 적용 됩니다. 출력할 값이 세개라면 % 문자 또한 세번 나와야 합니다.
2. 형식 지정의 첫번째 문자는 반드시 % 문자여야 합니다. 두번을 중복시켜서 %%와 같이 사용합니다.
3. []로 둘러싸인 부분은 옵션이므로 생략할수 있습니다.
4
ㅇ flags
1. 출력할 값의 앞에 표시할 문자를 설정하는 영역
2. 옵션이기 때문에 생략할수 있습니다.
3. 여래개의 플래그를 동시에 사용할수 있습니다.
printf([%+-6d]”,123); //[+123]-부호+왼쪽정렬
4.기호
– : 왼쪽 정렬, 기본값은 오른쪽 정렬 printf(“[%6d]”, 123); -> [ 123] printf(“[%-6d]”, -123); -> [-123 ]
0 : 앞자리에 공백대신 0 추가 : printf(“[%06d]”, 123); -> [000123]
(공백) : 양의정수일경우 +기호룰 출력하는 대신 공백 추가 printf(“[% d]”, 123); -> [ 123]
# : 8진수와 16진수 출력에서 공백 대신 0 또는 0x 출력 : printf(“[%#o]”, 123); -> [0173], printf(“[%x]”, 123); -> [0x7b]
c : 문자
s : 문자열
d : 부호있는 10진수
u : 부호없는 10진수
ㅇ : 부호없는 8진수
x, 부호 없는 16진수
p : 주소를 16진수로 출력
e : 지수형식으로 실수 출력
f : 고정형식으로 실수 출력 -> 소수점 6자리
g : f와 e 형식중에서 짧은 형식 선택 -> 소수점 3자리
탈출문자
\a : 경고음 발생
\b : 커서를 같은줄 이전의 위치로 이동
\t : 커서들 다음 수평탭의 위치로 이동
\n : 커서를 다음 줄의 시작으로 이동
\v : 커서를 다음 수직 탭의 위치로 이동
\f : 커서를 다음 수직 탭의 위치로 이동
\r : 커서를 줄의 시작으로 이동
\” : 큰따옴표
\’ : 작은 따옴표
\\ : 백슬래시
\0oo : 8진수
\xhh : 16진수
02. scanf 함수
개요
ㅇ 입력 함수로, 표준 입력파일로 부터 문자열 입력
ㅇ 약속된 형식에 맞게 입력 문자열을 다양한 자료형으로 변환한 결과를 변수에 저장합니다. scanf라는 이름은 scan formatted string의 약자입니다.
ㅇ 여타의 함수와 달리 매개변수의 개수를 마음대로 지정할수 있습니다.
ㅇ 한쌍을 이루는 출력함수인 printf와 다른점은 전달되는 매개 변수가 모두 주소라는 점입니다.
printf함수는 읽기만 할 경우 주소가 아니어도 되지만, scanf ㅎ마수에서는 언제나 메모리에 쓰기가 발생하기 때문에 모든 매개변수가 주소입니다.
설명
선언
int scanf(const char *format[,argument]…);
헤더파일
stdio.h
반환값
성공했을경우의 반환값은 문자여을 읽어서 다른 자료형으로 변환한 변수 개수이고, 실패했을경우에는 파일의 끝을 가리키는 EOF를 반환합니다. 0을 반환했다는 것은 읽기에는성공했을수 있지만, 자료형 변환에까지 성공한 변수는 없다는 것을 의미합니다.
상세
사용법
%[width]type
ㅇ 형식 문자열에 사용하는 형식은 입력할 변수에 대해 각각 적용됩니다. 입력할 값이 세개라면 % 문자 또한 세번 나와야 합니다.
ㅇ 형식지정의 첫번째 문자는 반드시 % 문자여야 합니다. %문자는 형식 지정에 사용하는 특수 문자로 %문자를 출력해야 한다면 두번 중복해서 %%와 같이 사용합니다.
ㅇ type
1. 숫자, 문자, 문자열중 하나
2. 타입 문자
c : 문자
s : 문자열
d : 부호있는 10진수
u : 부호 없는 8진수
o : 부호없는 16진수
f : 단정도실수 :
lf : 배정도 실수 l은 long를 의미
ㅇ주의
– 문자열 입력에서 마지막에 자동으로 NULL 문자가 추가되기 때문에, width 옵션에 사용하는 크기는 최대까지 지정할수 있습니다. width 옵션에서 사용하는 크기는 최대(버퍼크기-1)까지 지정할수 있습니다. width 옵션을 이용한 너비 지정은 고정된크기의 데이터를 입력 받을떄 유용하니다.
– 8진수는 입력할떄 앞에 0을 붙이고, 16진수는 0x를 붙입니다.
scanf(“%d %d %d”, &N1, &N2, &N3);
scanf 함수는 주소(포인터)자료형을 전달해야 하기떄문에 &N을 전달해야 합니다.
* 다음 코드는 타입과 매개변수 자료형이 일치하지 않기 떄문에 일치하지 않을 때 바랭하는 문제를 보여줍니다.
int n = 0;
scanf(“%d,&n); : 입력 A
printf(“%d”, n); : 출력 0
정수를 입력 받아야 하는 상황에서 문자를 입력했습니다. 결과는 변수 N의 값이 변경되지 않습니다. 최초 0을 넣은 상태에서 시작했고, 출력된 결과도 0이었습니다. 그래도 프로그램을 비정상적으로 종료시키는 등의 일은 하지 않기 때문에 경미한 실수로 여겨 집니다. 중요한 것은 사용자의 입력 데이터와 타입이 정확하게 일치해야 한다는점입니다.
#include<stdio.h>
int main(){
char pName[20];
int nAge;
int nBirth;
printf(“이름 : “); scanf(“%s”, pName ); //&가 빠짐. 이유는 주소를 받기때문에
printf(“나이 : “); scanf(“%s”, &nAge );
printf(“생일 : “); scanf(“%s”, &nBirth );
printf(“이름 : %s \n”, pName);
printf(“나이 : %s \n”, nAge);
printf(“생일 : %s \n”, nBirth);