티스토리 뷰
C의 자료형과 크기
- bool: 불리언, 1바이트
- char: 문자, 1바이트
- int: 정수, 4바이트
- float: 실수, 4바이트
- long: (더 큰) 정수, 8바이트
- double: (더 큰) 실수, 8바이트
- string: 문자열, ? 바이트 (빌트인 타입 아님)
char과 string
C에서는 char은 싱글 quote, string은 더블 quote로 나타낸다.
#include <stdio.h>
int main(void)
{
char c1 = 'H';
char c2 = 'I';
printf("%i %i\n", c1, c2); // 형식지정자를 c가 아닌 i로 하고, c1이나 c2를 int로 캐스팅하지 않아도 상응하는 아스키코드 숫자가 출력된다
}
int는 4바이트, char은 1바이트 이렇게 정해져있는 반면, string은 char의 배열이라고 볼 수 있기 때문에 몇 바이트일지 알 수 없다. string은 정해진 크기를 가질 수 없다.
\0 -> null terminating character (널 종단 문자) 8비트가 모두 0이다. 그래서 문자열은 실제로 필요한 char들의 바이트 + 1바이트를 차지하게 된다.
string을 받아서 한 문자(char)씩 출력하는 로직을 짜보자.
int main(void)
{
string s = get_string("Input: ");
printf("Output ");
for (int i = 0; i != '\0'; i++) // 널 종단 문자가 나올 때까지 출력
{
printf("%c", s[i]);
}
printf("\n")
}
종단 문자인지 아닌지 체크해서 프린트할 수도 있고, 또는 strlen이라는 함수를 사용해서 길이를 조건으로 루프를 돌 수도 있다. 다만 i < strlen(s)
라고 조건을 주게되면 for문을 돌 때마다 함수 호출을 해야해서 비효율적이다. 이걸 변수에 저장해서 쓴다면, 대신 저장공간이 들겠지만 s의 길이가 몇이냐는 질문을 계속하지 않아도 되므로 시간면에서 효율적이다. 즉 시간 효율 vs 공간 효율의 문제다.
#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
string s = get_string("Input: ");
printf("Output ");
for (int i = 0, n = strlen(s); i < n; i++) // string s의 길이를 n이라는 변수에 저장
{
printf("%c", s[i]);
}
printf("\n")
}
n이라는 변수에 저장할 때 for문 바깥에 한줄을 차지하면서 해도 되지만, for문 괄호 안에 넣는 방법도 있다. strlen은 string.h에 있는 함수다.
사용자 함수 만들기
평균을 구하는 average 함수를 만들어 보자
int main(void)
{
int scores[3];
scores[1] = 72;
scores[2] = 73;
scores[2] = 33;
}
const int N = 3 // 상수는 함수 바깥의 상단에 적고 대문자로 선언한다.
int main(void)
{
int scores[N];
scores[1] = 72;
scores[2] = 73;
scores[2] = 33;
}
float average(int length, int array[]); // 첫 줄째 선언해야만 찾을 수 있다.
int main(void)
{
int n = get_int("Number of scores: ")
int scores[n];
for (int i = 0; i < n; i++)
{
scores[i] = get_int("Score %i: ", i + 1);
}
printf("Average: %f", average(n, scores));
}
// length를 따로 넣어줘야 하는 이유?
// c에서는 배열은 스스로의 길이를 기억하지 않는다
float average(int length, int array[])
{
int sum = 0;
for (int i = 0; i < length; i++)
{
sum += array[i];
}
return sum / length; // sum도 정수, length도 정수. 나눈 것도 정수에 저장됨.
// 방법 1 - 둘 다 float로 캐스팅하기 (float) sum / (float) length
// 방법 2 - 하나만 float로 하기. 더 강력한 자료형을 반환하기 때문이다.
}
'공부일지(TIL) > Others' 카테고리의 다른 글
[C언어] string 구현하기 (0) | 2021.02.18 |
---|---|
[C언어] 16진수와 메모리 주소(포인터) (0) | 2021.02.17 |
하드웨어의 한계 (0) | 2021.01.22 |
컴퓨팅 사고 - 이진법 (0) | 2020.12.23 |
HTML5로 카드 만들기 (with Canvas API) (0) | 2019.06.11 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 인스턴스
- Prefix Sums
- c언어
- SQL
- 알고리즘
- 깃
- getter
- GIT
- jQuery
- 자바
- package.json
- 리덕스
- Session
- 제네릭스
- Conflict
- til
- oracle
- Redux
- 개발 공부
- rxjs
- this
- react
- Java
- youtube data api
- useEffect
- CSS
- 포인터 변수
- Data Structure
- JavaScript
- linkedlist
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함