공부일지(TIL)/Others
[C언어] char과 string, 사용자 함수 만들기
Alledy
2021. 2. 5. 15:56
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로 하기. 더 강력한 자료형을 반환하기 때문이다.
}