입·출력함수
- 출력함수
우선 출력함수는 저번에 사용한 printf가 있는데요, print안에 쓰는 포맷에대해 알아보겠습니다.
먼저 printf는 다음과 같은 형식으로 사용합니다. printf("포맷과 내용",변수명);
이때 포맷에는 각각의 자료형에 맞게 사용 해주면됩니다. int형일 경우 %d, double형일 경우 lf, float형일경우 f, 8진수와 16진수로 표현하고 싶을경우 %o,%x 문자 한글자일경우 %c, 문자열일경우 %s로 포맷을 지정해주면 됩니다. 그리고 굉장히 큰 수를 표현할 경우에는 수를 저장할때에 E를 활용하고 포맷도 %e로 써주면됩니다. 아래 코드를 보면서 확인해 보겠습니다.
-------------------------------------------------------------------------------------------------------
#include <stdio.h>
int main()
{
int a = 10;
double b = 3.14;
float c = 3.15;
char d = 3;
char e = 'Q';
char *f = "문자열";
// 정수형 : %d, double형 : lf, float형 : f, 문자 : %c, 문자열 :%s
printf(" a : %d\n a2 : %05d\n b : %lf\n c : %f\n d : %d\n e : %c\n f : %s\n",a,a,b,c,d,e,f);
}
-------------------------------------------------------------------------------------------------------
결과 값을 확인해보면 정상적으로 출력이 된걸 확인 할 수 있습니다. 이때, d를보시면 char형임에도 불구하고 작은 범위의 숫자 표현도 가능했습니다. a2는 %05d로 포맷을 지정했는데 결과값을 보면 00010 으로 나오는데, 5자리 정수를 표현하고 앞에 빈자리는 0으로 채우라는 포맷입니다.
- 입력함수
입력함수에는 scanf가 있습니다. 형식은 printf와 비슷합니다. scanf("포맷",저장할주소); 아래 코드를 보면서 확인해보겠습니다.
-------------------------------------------------------------------------------------------
#include <stdio.h>
#pragma warning(disable:4996)
int main()
{
int a, b;
printf("a:");
scanf("%d", &a); // 변수앞에 &사용
printf("b:");
scanf("%d", &b);
printf("a+b: %d\n",a+b);
}
-------------------------------------------------------------------------------------------
Visual Studio 2013에서는 scanf를 쓰면 취약하다는 문구가 뜨면서 오류가 납니다. scanf_s함수를 사용하거나, #pragma warning(disable:4996) 또는 #define _CRT_SECURE_NO_WARNINGS를 헤더파일 밑에 넣어주면 오류가 나지 않습니다. printf와 유사하지만 뒤에 변수앞에 &(엔퍼센트)를 붙여야 합니다. 저장할 주소를 입력 해야하기 때문에 &를 붙여줍니다. 문자를 입력받을때에는 &를 쓰지않습니다. 또한 scanf에서는 \n(줄바꿈문자)를 쓰지않습니다.
아래 코드처럼 따로따로 입력 받지 않고, 여러개를 한번에 입력 받을 수도 있습니다.
-------------------------------------------------------------------------------------------
#include <stdio.h>
#pragma warning(disable:4996)
int main()
{
int a, b;
printf("a와 b를입력하시면 합이 출력됩니다. \n");
scanf("%d %d", &a, &b);
printf("a+b: %d\n",a+b);
}
-------------------------------------------------------------------------------------------
기본자료형(Basic Type)
1) 정수형
- 위의 코드들 처럼 printf와 scanf에 %d 를사용합니다.
2) 부동소수형
- 부동소수는 소수점이 움직인다는 말로, 부동소수 표기법은 근사치를 표기하기 위한 방법입니다. 큰 자료형 일수록 정밀도가 증가합니다. 정밀도는 숫자를 얼마나 정밀하게 표현하는가를 뜻합니다. printf 함수에 특별한 옵션이 없는 경우 기본적으로 소수점 6자리에서 반올림해서 출력합니다.
- float과 double 비교
아래 코드는 x,y에 같은 소수점 16자리수를 넣고 16자리까지 출력하라는 코드입니다. 결과가 어떻게될까요?
-------------------------------------------------------------------------------------------
#incldue <stdio.h>
int main()
{
float x;
double y;
x = 1.23455678901234567;
y = 1.23455678901234567;
printf("float형 : %.16f\n double형 : %.16lf\n", x, y);
}
-------------------------------------------------------------------------------------------
둘 다 16자리까지 출력을 했지만, float형은 값을 정확하게 저장하지 못했습니다. double형이 float형보다 더 정밀하게 표현합니다.
3) 문자형
위에서도 언급하였듯 char는 문자형 자료형과 정수형 자료형 둘 다 간주합니다. 정수형에서 char의 범위는 -128~127인데, 총 256개의 숫자와 문자가 표현 가능합니다. 문자는 하나하나 숫자가 정해져있습니다.
- ascii code(아스키 코드) : 숫자 값에 문자를 하나씩 대응시켜 놓은 코드입니다.
아스키표를 정리해놓은 사이트입니다. http://www.asciitable.com/
아래 코드는 char형으로 65를 선언하고 정수와 문자로 출력하는 코드입니다.
-------------------------------------------------------------------------------------------
#include <stdio.h>
int main()
{
char a = 65;
printf("정수 : %d\n문자 : %c\n", a,a);
}
-------------------------------------------------------------------------------------------
이처럼 정수로 출력할 때는 65가 나오지면 문자로 출력했을때는 알파벳 대문자 A가 출력됩니다.
아스키 코드표를 이용하면 영문 소문자를 대문자로 변환하거나 반대로 대문자를 소문자로 변환할 수 있습니다. 아스키 코드표를 보면 대문자 'A'가 65 소문자 'a'가97입니다. 32가 차이나는점을 이용해 소문자를 대문자로 바꾸는 코드를 짜봤습니다. 아래 코드는 영문 소문자를 입력하면 대문자로 변환하는 코드입니다.
-------------------------------------------------------------------------------------------
#include <stdio.h>
#pragma warning(disable:4996)
int main()
{
char ch;
printf("영문 소문자를 입력하면 대문자로 변환됩니다 : ");
scanf("%c", &ch); // 숫자 계산을 해야하므로 &를 붙여줍니다.
printf("영문 대문자 : %c\n",ch-32); // 숫자 계산을하고난 후 출력은 문자로 해줍니다.
}
-------------------------------------------------------------------------------------------
- 배열 : 기본 자료형의 연속을 한번에 다루는 자료형으로 문자를 여러 개 묶어서 사용합니다.
char x[5]로 선언하게되면 char형이 char[0],char[1],char[2],char[3],char[4] 5개가 선언이됩니다. "LOVE"라는 문자열을 넣고싶다면 배열의 순서대로 넣어주면됩니다. 배열의 끝에는 널문자라고 불리는 '\0' 를 넣어줘야합니다. 문자열의 끝을 표시해주지 않으면 않으면 남는 배열의 크기만큼 쓰레기값이 뒤에 붙게됩니다. 아래 코드는 배열의 크기를 넉넉하게 선언하고, 널값을 주석처리 했을때의 코드입니다.
-------------------------------------------------------------------------------------------
#include <stdio.h>
int main()
{
char x[8]; // 배열을 8로 넉넉하게 선언
x[0] = 'L';
x[1] = 'O';
x[2] = 'V';
x[3] = 'E';
// x[4] = '\0'; // 널값을 주석처리
printf(x);
}
-------------------------------------------------------------------------------------------
위에 방법처럼 배열에 직접 한글자씩 넣어줄수도있지만, 번거롭다면 변수를 선언하면서 동시에 "="를 써서 초기값을 설정 하거나, String Copy의 줄임말인 strcpy함수를 쓰면 간편하게 배열에 문자열을 저장할 수 있습니다. 이때 strcpy함수를 사용하기 위해서는 <string.h> 헤더파일을 포함시켜야합니다.
-------------------------------------------------------------------------------------------
#include <stdio.h>
int main()
{
char x[5]="LOVE";
printf("%s\n",x);
}
-------------------------------------------------------------------------------------------
#include <stdio.h>
#include <string.h>
int main()
{
char x[5];
strcpy(x,"LOVE");
printf("%s\n",x);
-------------------------------------------------------------------------------------------
형 변환 혹은 타입캐스팅(Type Casting)
계산을 할 때, 타입이 다를경우 형변환을 해줘야 합니다.
- 묵시적 형 변환 (implicit type conversion) : c언어 스스로 형 변환 수행하는 경우입니다. 아래와 같은 계산이 있을경우, 3은 정수이므로 float형으로 형변환 되어 계산됩니다.
-------------------------------------------------------------------------------------------
float x;
x = 3.14 + 3 ;
-------------------------------------------------------------------------------------------
- 명시적 형 변환 (explicit type conversion) : 사용자가 직접 형 변환을 붙여 직접 형 변환 수행하는 경우 입니다. 아래코드는 계산은 double형으로 하고 결과를 int형으로변환 하는 경우 입니다. 형변환 하면 소수점은 반올림하지 않고 버림하게됩니다.
-------------------------------------------------------------------------------------------
double x=1.2;
double y=3.9
int result = (int)x+y;
-------------------------------------------------------------------------------------------
- 형넓히기 : 작은자료형->더큰 자료형으로 확장되며 형변환
- 형좁히기 : 큰자료형->작은자료형 정보손실 발생->컴파일러에서 경고
* 출처 : 한국기술교육대학교 온라인평생교육원 C 프로그래밍_1
스타일 C프로그래밍 저.김종훈,김종진 출.WellBook
http://www.asciitable.com/