[C언어] printf scanf
C언어를 배울 것이다
그렇게 됐다.
우선 맨 마지막에 등장하는 return 0;은 int 0을 반환한다는 뜻인데, 운영체제에 꼭 값0을 반환한다기 보다는 현재 실행중인 함수를 끝내려고 쓰는 것이다.
\n은 줄바꿈표시이다
%d는 쉼표 뒤에 오는 정수가 차례로 대입되서 출력된다.(decimal 의 약자. 십진법)
int age = 12 라고 한 번 age는 정수라고 선언해주면
이후로는 age를 쓸 때 int를 붙여주지 않아도 된다
정수형 변수는 int
실수형 변수는 float
float 뒤에는 위와같이 f를 붙여주는 게 좋다.
이유는 아직 잘 모르지만 https://edu.goorm.io/qna/2525 를 참고하자
(참고 float은 소수점 6번째 자리까지, double은 소수점 15번째까지 나타낸다
+ double은 printf("%lf")로 나타낸다. f앞에 l(엘) 붙여서. long float의 줄임말. 숫자끝에 fl이나 d 따위를 붙이진 않음.)
소수점 뒷자리까지 저렇게 늘어지는 게 싫다면 나타내고자 하는 자리수를 직접 정할 수도 있다.
이렇게 f앞에 .n 으로 입력하면 된다.(n = 소수점 자릿수)
상수
상수는 자바스크립트에서도 배웠듯,
const로 나타낸다. const로 나타낸 값들은 이후에 바꿀 수 없다.
scanf
scanf 함수는 표준입력 (stdin)에서 형식화된 데이터를 읽는 함수이다.
입력을 받는 함수는 이 외에 더 있지만 나중에 알아보기로
scanf 를 쓸땐 무조건 scanf_s 로 입력하자
*scanf와 scanf_s의 차이*
기존에 사용하던 scanf함수는 지정된 버퍼의 크기보다 더 많은 양의 문자를 넣을수 있기 때문에 버퍼오버플로우에 대해서 많이 취약했다. 이러한 부분을 보완하고자 만든 함수가 scanf_s이다. _ 즉, 보안을 위해서 보완한 함수이다.
scanf와 scanf_s의 사용법은 거의 똑같지만, 문자와, 문자열을 입력받을 경우에 인자값으로 하나를 더 입력해 줘야한다.
먼저 정보를 받을 변수를 만들고 scanf_s로 정보를 받는다.
&(ampersand)는 해당 변수에 입력된 정보를 임시로 저장할 주소를 부여한다.
여기서 만약 문자열(%s)을 집어넣을 경우엔 문자열 자체(변수가 포인터거나 배열 일때)는 주소이므로 안써도 된다.
(&에 대한자세한 내용은 https://security-nanglam.tistory.com/194 참고)
여러개의 정수도 받아보자.
줄이 달라도 값이 순서대로 잘 부여되는 걸 알 수 있다.
이번엔 숫자말고 문자를 넣어보자
문자, 문자열
문자는 한글자, 문자열은 두 자 이상의 문자를 말한다.
문자(열)는 char로 정의한다.
문자출력
문자를 출력해보자
문자열출력
C언어에서는 문자열을 다루는 string 자료형이 없다.
즉, char을 여러개 모아 배열 형태로 사용해야한다.
문자열을 출력하는 방법은 크게 두 가지가 있다.
첫번째 일반 정수 처럼 데이터를 하나씩 쉼표로 나열하는 방법이다.
문자이기 때문에 각 문자에는 작은 따옴표가 붙는다.
(c언어에서는 작은 따옴표 큰따옴표 잘 구분하자!)
변수 옆에 []에 대해 알아보자
[] 안에는 문자가 들어갈 개수를 입력하는데 항상 문자수 +1로 입력한다.
문자열을 사용할때는 "문장이 여기에서 끝났습니다" 라고 알려주는 Null 문자(\0, 0)가 필요하다
즉, 0이 들어갈 공간 한칸을 더 확보해주어야 하는 것이다.
그리고 두번째 방법
훨씬 간단하다. 큰 따옴표에 삽입하는 방법이다. 중괄호도 필요없다.
이 방식을 쓸 땐 문자의 개수를 입력하지 않아도 된다.
문자(열)입력
바로 문자부터 보자
이번엔 문자열
[256]에 대한 것은 이후에 배열을 배울 때 같이 언급하도록 하고 일단은 넘어가자
문자열을 입력 받을 때는 %s를 쓰며, 변수앞에 &를 붙이지 않는다.
또한 scanf와는 다르게 scanf_s에서는 뒤에 입력받을 크기도 함께 입력해준다.
아직 잘 이해가 되지 않으니 일단 외우자 공부하다보면 깨닫게 될 것이다.
이제 배운 내용을 응용해보자
하지만 문자열을 입력할 때에 발생할 수 있는 문제가 있다. 바로 띄어쓰기 !
띄어쓰기를 주면 scanf는 공백을 문자열의 끝으로 인식하기 때문에 그 이후의 텍스트는 다 잘리게 된다.
이럴 때 필요한 게 [^] ! 쓰임은 아래와 같다
기존의 %s 사이에 [^문자]을 넣어주면 된다.
여기서 [^문자]의 의미는 해당 문자가 나오기 전까지 모든 문자열을 받겠다는 뜻이다.
즉 [^\n]은 줄바꿈을 하기 전까지 모든 문자열을 받겠다는 의미가 된다.
[^asd]로 적으면 "asd"라는 문자가 나오기 전까지의 문자열을 의미하게 되고~
뭔말인지 알겠쥬
문제없이 출력되는 걸 확인할 수 있다.