티스토리 뷰

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로 하기. 더 강력한 자료형을 반환하기 때문이다. 
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함