프로젝트/42Seoul

42서울 라피신 1주차 (C00~C02)

soohykim 2025. 4. 9. 12:54
728x90
반응형

📒 C00

when

  • 23.01.12 목 10:20 ~ 23:00

📁 별명 설정

alias cc='cc -Wall -Wextra -Werror' (필수)
alias norminette='norminette -R CheckForbiddenSourceHeader' (선택)

📁 nominette

norminette [파일명].c (에러 없을 시 통과)

📁 write (인자, 문자가 있는 버퍼 첫 주소, 문자 크기)

  • 0 : 표준 입력
  • 1 : 표준 출력
  • 2 : 표준 오류
  • 정수 입력x, 숫자를 아스키코드 이용해 출력
  • 숫자 -> 문자 : (1) '0' 더하기 (2) 48 더하기

1. ex00) ft_putchar

매개변수로 전달되는 문자 출력

#include <unistd.h>

void	ft_putchar(char c)
{
	write(1, &c, 1);
}

2. ex01) ft_print_alphabet

소문자 알파벳 'a'부터 오름차순 출력

  • ascii code : 'a' = 97, 'z' = 122
#include <unistd.h>

void	ft_print_alphabet(void)
{
	char	c;

	c = 97;
	while (c <= 122)
	{
		write(1, &c, 1);
		c++;
	}
}

3. ex02) ft_print_reverse_alphabet

소문자 알파벳 'z'부터 내림차순 출력

#include <unistd.h>

void	ft_print_reverse_alphabet(void)
{
	char	c;

	c = 122;
	while (c >= 97)
	{
		write(1, &c, 1);
		c--;
	}
}

4. ex03) ft_print_numbers

모든 숫자(digits) 오름차순 출력

#include <unistd.h>

void	ft_print_numbers(void)
{
	char	c;

	c = '0';
	while (c <= '9')
	{
		write(1, &c, 1);
		c++;
	}
}

5. ex04) ft_is_negative

매개변수로 입력한 정수에 따라 n이 음수면 'N' / 양수거나 NULL이면 'P' 출력

  • 문자 '', 문자열 ""
#include <unistd.h>

void	ft_is_negative(int n)
{
	char	a;
	char	b;

	a = 'N';
	b = 'P';
	if (n < 0)
	{
		write(1, &a, 1);
	}
	else
	{
		write(1, &b, 1);
	}
}

6. ex05) ft_print_comb

세 자릿수의 모든 다른 조합을 오름차순으로 표시하여 나열

#include <unistd.h>

void	ft_print_comma(int i, int j, int k);

void	ft_print_comb(void)
{
	int	i;
	int	j;
	int	k;

	i = '0';
	while (i <= '7')
	{
		j = i + 1;
		while (j <= '8')
		{
			k = j + 1;
			while (k <= '9')
			{
				write(1, &i, 1);
				write(1, &j, 1);
				write(1, &k, 1);
				ft_print_comma(i, j, k);
				k++;
			}
			j++;
		}
		i++;
	}
}

void	ft_print_comma(int i, int j, int k)
{
	if (i != '7' || j != '8' || k != '9') // 마지막일 때만 ,출력 제외 
	{
		write(1, ", ", 2);
	}
}

7. ex06) ft_print_comb2

00와 99 사이의 두 자릿수의 모두 다른 조합을 오름차순으로 나열

1) left 출력

  • left의 10의 자리수는 /(몫)을 이용해 출력
  • left는 정수형 변수라서 '0' (혹은 48)을 더해 문자로 바꾸기

2) right 출력

  • left + 1 반복
##include <unistd.h>

void	ft_putchar(char c)
{
	write(1, &c, 1);
}

void	ft_print_comb2(void)
{
	int	left;
	int	right;

	left = 0;
	while (left <= 98)
	{
		right = left + 1;
		while (right <= 99)
		{
			ft_putchar(left / 10 + '0');
			ft_putchar(left % 10 + '0');
			write(1, " ", 1);
			ft_putchar(right / 10 + '0');
			ft_putchar(right % 10 + '0');
			if (left != 98)
			{
				write(1, ", ", 2);
			}
			right++;
		}
		left++;
	}
}

8. ex07) ft_putnbr

int 유형 변수 내에서 가능한 모든 값을 출력하는 함수

1) 숫자가 음수인 경우

  • 숫자에 -를 곱해 양수로 바꿔주기
  • 먼저 "-" 출력

2) 숫자 출력

  • 10으로 나눠 재귀함수
  • 10의 나머지 재귀함수

3) 예외처리

  • int형 범위 (-2^32-1 ~ 2^32)
  • -2,147,483,648 예외처리
#include <unistd.h>

void	ft_putchar(char c)
{
	write(1, &c, 1);
}

void	ft_putnbr(int nb)
{
	if (nb == -2147483648)
	{
		write(1, "-2147483648", 11);
	}
	else
	{
		if (nb < 0)
		{
			nb *= -1;
			write(1, "-", 1);
		}
		if (nb > 10)
		{
			ft_putnbr(nb / 10);
			ft_putnbr(nb % 10);
		}
		else
		{
			ft_putchar(nb + '0');
		}
	}
}

9. ex08) ft_print_combn

#include <unistd.h>

void    ft_putchar(char c)
{
    write(1, &c, 1);
}

void    ft_putstr(int size, int *arr)
{
    int i;

    i = 0;
    while (i < size)
    {
        ft_putchar(arr[i] + '0');
        i++;
    }
    if (arr[0] != (10 - size))
        write(1, ", ", 2);
}

void    ft_recursive(int size, int i, int *arr)
{
    if (i == 0)
        arr[i] = i;
    else
        arr[i] = arr[i - 1] + 1;
    while (arr[i] <= 10 - size + i)
    {
        if (i == (size - 1))
            ft_putstr(size, arr);
        else
            ft_recursive(size, i + 1, arr);
        arr[i]++;
    }
}

void    ft_print_combn(int size)
{
    int depth;
    int arr[10];

    depth = 0;
    ft_recursive(size, depth, arr);
}

재귀 함수 이용해 풀이 (매 함수 출력할 때 10씩 나누기 -> 나머지 출력)

C00 main.c

1. ex00) ft_putchar

int	main(void)
{
	ft_putchar('a');
}

2. ex01) ft_print_alphabet

int	main(void)
{
	ft_print_alphabet();
}

3. ex02) ft_print_reverse_alphabet

int	main(void)
{
	ft_print_reverse_alphabet();
}

4. ex03) ft_print_numbers

int	main(void)
{
	ft_print_numbers();
}

5. ex04) ft_is_negative

int main(void)
{
    int n;

    n = 10;
    ft_is_negative(n);
}

6. ex05) ft_print_comb

int	main(void)
{
	ft_print_comb();
}

7. ex06) ft_print_comb2

int	main(void)
{
	ft_print_comb2();
}

8. ex07) ft_putnbr

int main(void)
{
    int n;

    n = 42;
    ft_putnbr(n);
}

9. ex08) ft_print_combn

int main(void)
{
    ft_print_combn(6);
}

📒 C01

when

  • 23.01.14 토 10:00 ~ 23:00

📁 포인터

주소 연산자(&) : 변수의 메모리 주소
참조 연산자(*) : 포인터가 가리키는 주소를 가진 변수에 저장된 값

  • 선언
    int num = 5;
    int *ptr = #

-> *ptr = 5
-> &ptr = ptr의 주소
-> ptr = num의 주소

1. ex00) ft_ft

int형 변수에 대한 포인터를 매개변수로 받아 해당 포인터에 int형 값42 설정

#include <instd.h>

void	ft_ft(int *nbr)
{
	*nbr = 42;
}

2. ex01) ft_ultimate_ft

int형 변수에 대한 포인터에 대한 X8 포인터를 매개변수로 받고, 해당 포인터에 int형 값 42 설정

#include <unistd.h>

void	ft_ultimate_ft(int *********nbr)
{
	*********nbr = 42;
}

3. ex02) ft_swap

주소가 매개변수로 입력된 두 정수의 값 바꾸기

#include <unistd.h>

void	ft_swap(int *a, int *b)
{
	int	swap;

	swap = *a;
	*a = *b;
	*b = swap;
}

4. ex03) ft_div_mod

매개변수 a를 b로 나눈 몫 -> div가 가리키는 int에 저장

매개변수 a를 b로 나눈 나머지 -> mod가 가리키는 int에 저장

#include <unistd.h>

void	ft_div_mod(int a, int b, int *div, int *mod)
{
	*div = a / b;
	*mod = a % b;
}

5. ex04) ft_ultimate_div_mod

매개변수 a를 b로 나눈 몫 -> a가 가리키는 int에 저장

매개변수 a를 b로 나눈 나머지 -> b가 가리키는 int에 저장

#include <unistd.h>

void	ft_ultimate_div_mod(int *a, int *b)
{
	int	div;
	int	mod;

	div = *a / *b;
	mod = *a % *b;
	*a = div;
	*b = mod;
}

6. ex05) ft_putstr

문자열 출력

#include <unistd.h>

void	ft_putstr(char *str)
{
	int	i;

	i = 0;
	while (str[i])
	{
		write(1, &str[i], 1);
		i++;
	}
}

7. ex06) ft_strlen

문자열의 문자 수 반환

#include <unistd.h>

int	ft_strlen(char *str)
{
	int	i;

	i = 0;
	while (str[i])
	{
		i++;
	}
	return (i);
}

8. ex07) ft_rev_int_tab

정수 배열 순서 뒤집기

1) 1번과 (size)번 교환
2) 2번과 (size-1)번 교환
3) (size/2) 번 반복

void	rev_int_tab(int* tab, int size)
{
	int	i;
	int	j;
	int tmp;

	i = 0;
	j = size - 1;
	while (i < (size / 2))
	{
		tmp = tab[i];
		tab[i] = tab[j];
		tab[j] = tmp;
		i++;
		j--;
	}
}

9. ex08) ft_sort_int_tab

정수 배열 오름차순 정렬

1) 1번과 2번 비교 후 교환
2) (size-1)번과 (size)번 비교 후 교환
3) 1~2번을 size-1번 반복

#include <unistd.h>

void	ft_swap(int *a, int *b)
{
	int	temp;

	temp = *a;
	*a = *b;
	*b = temp;
}

void	ft_sort_int_tab(int *tab, int size)
{
	int	i;
	int	j;

	i = 0;
	while (i < size - 1)
	{
		j = 0;
		while (j < size - i - 1)
		{
			if (tab[j] > tab[j + 1])
			{
				ft_swap(&tab[j], &tab[j + 1]);
			}
			j++;
		}
		i++;
	}
}

C01 main.c

1. ex00) ft_ft

#include <stdio.h>

int main(void)
{
    int n;

    ft_ft(&n);
    printf("\n%d : 42면 답 \n", n);
}

2. ex01) ft_ultimate_ft

#include <stdio.h>

int	main(void)
{
	int	nbr1;
	int *nbr2 = &nbr1;
	int	**nbr3 = &nbr2;
	int ***nbr4 = &nbr3;
	int ****nbr5 = &nbr4;
	int *****nbr6 = &nbr5;
	int ******nbr7 = &nbr6;
	int *******nbr8 = &nbr7;
	int ********nbr9 = &nbr8;

    ft_ultimate_ft(&nbr9);
    printf("\n%d : 42면 답\n", nbr1);
}

3. ex02) ft_swap

#include <stdio.h>

int main(void)
{
    int i;
    int j;

    i = 2;
    j = 24;
    printf("before : %d, %d\n", i, j);
    ft_swap(&i, &j);
    printf("\nafter :  %d, %d\n순서 잘 바뀌었으면 답\n", i, j);
}

4. ex03) ft_div_mod

#include <stdio.h>

int main(void)
{
    int div;
    int mod;

    ft_div_mod(10, 3, &div, &mod);
    printf("\ndiv : %d, mod : %d", div, mod);
    printf("\ndiv : 3, mod : 1 이면 답\n");
}

5. ex04) ft_ultimate_div_mod

#include <stdio.h>

int main(void)
{
    int a;
    int b;

    a = 10;
    b = 3;
    ft_ultimate_div_mod(&a, &b);
    printf("\ndiv : %d, mod : %d", a, b);
    printf("\ndiv : 3, mod : 1 이면 답\n");
}

6. ex05) ft_putstr

#include <stdio.h>

int main(void)
{
    char    *str;

    str = "1234567890";
    ft_putstr(str);
    printf("\n 1234567890 이 나오면 정답\n");
}

7. ex06) ft_strlen

#include <stdio.h>

int main(void)
{
    char    *str;

    str = "1234567890";
    printf("%d", ft_strlen(str));
    printf("\n10 이 나오면 정답\n");
}

8. ex07) ft_rev_int_tab

#include <stdio.h>

int main(void)
{
    int tab [13] = {12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
    int size;
    int i;

    size = 13;
    i = 0;
    printf("\nAfter :  ");
    while (i < 13)
    {
        printf("%d ", tab[i]);
        i++;
    }
    ft_rev_int_tab(tab, size);
    printf("\nAfter :  ");
    i = 0;
    while (i < 13)
    {
        printf("%d ", tab[i]);
        i++;
    }
    printf("\n역순 맞으면 정답\n");
}

9. ex08) ft_sort_int_tab

#include <stdio.h>

int main(void)
{
    int tab [10] = {8, 6, 1, 0, 2, 5, 4, 7, 9, 3};
    int i;
    int size;

    size = 10;
    i = 0;
    printf("Before : ");
    while (i < size)
    {
        printf("%d ", tab[i]);
        i++;
    }
    printf("\nAfter :  ");
    ft_sort_int_tab(tab, size);
    i = 0;
    while (i < size)
    {
        printf("%d ", tab[i]);
        i++;
    }
    printf("\n정렬 잘 되었으면 정답\n");
}

📒 C02

when

  • 23.01.15 일 13:30 ~ 23:00

1. ex00) ft_strcpy

  • dest에 src 복사
  • 끝에 NULL 삽입
  • dest 포인터 반환
char    *ft_strcpy(char *dest, char *src)
{
    int i;

    i = 0;
    while (src[i])
    {
        dest[i] = src[i];
        i++;
    }
    dest[i] = '\0';
    return (dest);
}

2. ex01) ft_strncpy

  • dest에 src 복사
  • n개보다 src 짧으면 NULL 삽입
  • dest 포인터 반환
char    *ft_strncpy(char *dest, char *src, unsigned int n)
{
    unsigned int    i;

    i = 0;
    while (*(src + i) && i + 1 < n)
    {
        *(dest + i) = *(src + i);
        i++;
    }
    while (i < n)
    {
        *(dest + i) = '\0';
        i++;
    }
    return (dest);
}

3. ex02) ft_str_is_alpha

  • a (97) ~ z (122)
  • A (65) ~ Z (90)
int ft_str_is_alpha(char *str)
{
    int i;
    int alpha;

    i = 0;
    alpha = 0;
    while (str[i] == '\0')
    {
        alpha = 1;
        return (alpha);
    }
    while (*(str + i))
    {
        if (*(str + i) >= 97 && *(str + i) <= 122)
            alpha = 1;
        else if (*(str + i) >= 65 && *(str + i) <= 90)
            alpha = 1;
        i++;
    }
    return (alpha);
}

4. ex03) ft_str_is_numeric

  • 0 (48) ~ 9 (57)
int ft_str_is_numeric(char *str)
{
    int i;
    int num;

    i = 0;
    num = 1;
    if (str[i] == '\0')
        return (num);
    while (*(str + i))
    {
        if (*(str + i) < 48 || *(str + i) > 57)
            num = 0;
        i++;
    }
    return (num);
}

5. ex04) ft_str_is_lowercase

  • a (97) ~ z (122)
int ft_str_is_lowercase(char *str)
{
    int i;
    int lower;

    i = 0;
    lower = 1;
    if (str[i] == '\0')
        return (lower);
    while (*(str + i))
    {
        if (*(str + i) < 97 || *(str + i) > 122)
            lower = 0;
        i++;
    }
    return (lower);
}

6. ex05) ft_str_is_uppercase

  • A (65) ~ Z (90)
int ft_str_is_uppercase(char *str)
{
    int i;
    int upper;

    i = 0;
    upper = 1;
    if (str[i] == '\0')
        return (upper);
    while (*(str + i))
    {
        if (*(str + i) < 65 || *(str + i) > 90)
            upper = 0;
        i++;
    }
    return (upper);
}

7. ex06) ft_str_is_printable

  • 출력 불가능한 아스키 문자 (0 ~ 31, 127)
int ft_str_is_printable(char *str)
{
    int i;
    int prt;

    i = 0;
    prt = 1;
    if (str[i] == '\0')
        return (prt);
    while (*(str + i))
    {
        if (*(str + i) < 32 || *(str + i) > 126)
            prt = 0;
        i++;
    }
    return (prt);
}

8. ex07) ft_strupcase

  • a (97) ~ z (122)
  • A (65) ~ Z (90)
char    *ft_strupcase(char *str)
{
    int i;

    i = 0;
    while (*(str + i))
    {
        if (*(str + i) >= 97 && *(str + i) <= 122)
        {
            *(str + i) -= 32;
        }
        i++;
    }
    return (str);
}

9. ex08) ft_strlowcase

  • a (97) ~ z (122)
  • A (65) ~ Z (90)
char    *ft_strlowcase(char *str)
{
    int i;

    i = 0;
    while (*(str + i))
    {
        if (*(str + i) >= 65 && *(str + i) <= 90)
        {
            *(str + i) += 32;
        }
        i++;
    }
    return (str);
}

10. ex09) ft_strcapitalize

  • 모두 소문자로 변환
  • 앞이 공백o / 대문자x / 소문자x / 숫자x -> 대문자 변환
    • a (97) ~ z (122)
    • A (65) ~ Z (90)
char    *ft_strcapitalize(char *str)
{
    int i;
    int check;
    int c;

    i = 0;
    check = 1;
    while (*(str + i))
    {
        if (*(str + i) >= 'A' && *(str + i) <= 'Z')
            *(str + i) += 32;
        i++;
    }
    i = 0;
    while (*(str + i))
    {
        c = *(str + i);
        if (check == 1 && (c >= 'a' && c <= 'z'))
            *(str + i) -= 32;
        if (c < 48 || (c > 57 && c < 65) || (c > 90 && c < 97) || c > 122)
            check = 1;
        else
            check = 0;
        i++;
    }
    return (str);
}

11. ex10) ft_strlcpy

  • dest에 src 복사
  • 마지막에 NULL 추가
  • src 길이 반환
unsigned int    ft_strlcpy(char *dest, char *src, unsigned int size)
{
    unsigned int    i;
    unsigned int    s;

    i = 0;
    s = 0;
    while (*(src + s))
        s++;
    if (size < 1)
        return (0);
    while (*(src + i) && i < size - 1)
    {
        *(dest + i) = *(src + i);
        i++;
    }
    *(dest + i) = '\0';
    return (s);
}

12. ex11) ft_putstr_non_printable

  • 출력할 수 없는 아스키 (0 ~ 31, 127)
  • 16진법 변환
#include <unistd.h>

void    ft_putchar(char c)
{
    write(1, &c, 1);
}

void    ft_hexa(int h, int index)
{
    char    hexa    [17];

    hexa = "0123456789abcdef";
    if (h >= 16)
    {
        ft_hexa(h / 16, 1);
        ft_hexa(h % 16, 1);
    }
    else
    {
        if (index == 0)
            ft_putchar('0');
        ft_putchar(hexa[h]);
    }
}

void    ft_putstr_non_printable(char *str)
{
    unsigned int    i;

    i = 0;
    while (*(str + i))
    {
        if (*(str + i) < 32 || *(str + i) > 127)
        {
            ft_putchar('\\');
            ft_hexa(*(str + i), 0);
        }
        else
            ft_putchar(*(str + i));
        i++;
    }
}

13. ex12) ft_print_memory

  • 16개씩 나눠 각 줄의 첫 번째 주소값 전달
  • addr : 16진법으로 변환
  • hexa : 문자열의 2글자를 16진법으로 변환
    • 마지막 NULL 문자도 변환
  • str : 문자열을 그대로 출력
    • 출력 불가능한 문자 -> .
    • NULL 문자 -> .
#include <unistd.h>

char	ft_hexa(unsigned long long s)
{
	char	*hexa;

	hexa = "0123456789abcdef";
	return (hexa[s]);
}

void	ft_print_addr(unsigned long long addr)
{
	int		i;
	char	hex[17];

	i = 15;
	while (i >= 0)
	{
		hex[i] = ft_hexa(addr % 16);
		addr /= 16;
		i--;
	}
	write(1, hex, 16);
	write(1, ": ", 2);
}

void	ft_print_hexa(unsigned char *c, int size)
{
	int	i;
	int	h;

	i = 0;
	while (i < size)
	{
		h = *(c + i);
		write(1, &"0123456789abcdef"[h / 16], 1);
		write(1, &"0123456789abcdef"[h % 16], 1);
		if (i % 2 == 1)
			write(1, " ", 1);
		if (*(c + i) == '\0')
		{
			i++;
			break ;
		}
		i++;
	}
	while (i < 16)
	{
		write(1, "  ", 2);
		if (i % 2 == 1)
			write(1, " ", 1);
		i++;
	}
}

void	ft_print_str(unsigned char *c, int size)
{
	int				i;
	unsigned int	s;

	i = 0;
	while (i < size)
	{
		s = *(c + i);
		if (s == 0)
		{
			write(1, ".", 1);
			break ;
		}
		if (s < 32 || s > 127)
			write(1, ".", 1);
		else
			write(1, &s, 1);
		i++;
	}
}

void	*ft_print_memory(void *addr, unsigned int size)
{
	unsigned char	*c_addr;
	unsigned int	c_size;
	unsigned int	i;

	i = 0;
	c_addr = addr;
	while (i < size)
	{
		if (i < size)
			c_size = 16;
		else
			c_size = size % 16;
		ft_print_addr((unsigned long long)addr + i);
		ft_print_hexa(c_addr + i, c_size);
		ft_print_str(c_addr + i, c_size);
		write(1, "\n", 1);
		i += 16;
	}
	return (addr);
}

C02 main.c

1. ex00) ft_strcpy

#include <stdio.h>

char    *ft_strcpy(char *dest, char *src);

int main(void)
{
    char dest[] = "aaaaaaaaaaaaaaaaa";
    char src[] = "exercise00 is finished.";
    printf("%s : dest\n", ft_strcpy(dest, src));
    printf("%s : src\n", src);
}

2. ex01) ft_strncpy

#include <stdio.h>

char    *ft_strncpy(char *dest, char *src, unsigned int n);

int main(void)
{
    char    dest[] = "aaaaaaaaaaaaaaaaaaaaaaaaa";
    char    src[] = "exercise01 is finished";

    printf("%s : dest  n = 9\n", ft_strncpy(dest, src, 9));
    printf("%s : src\n", src);
}

3. ex02) ft_str_is_alpha

#include <stdio.h>

int ft_str_is_alpha(char *str);

int main(void)
{
    char str1[] = "exercise 02";
    char str2[] = "01234";
    char str3[] = "";
    printf("%s 입력\n", str1);
    printf("%d : 1 나오면 답\n", ft_str_is_alpha(str1));
    printf("%s 입력\n", str2);
    printf("%d : 0 나오면 답\n", ft_str_is_alpha(str2));
    printf("%s 비어있음\n", str3);
    printf("%d : 1 나오면 답\n", ft_str_is_alpha(str3));
}

4. ex03) ft_str_is_numeric

#include <stdio.h>

int ft_str_is_numeric(char *str);

int main(void)
{
    char str1[] = "exercise 03";
    char str2[] = "01234";
    char str3[] = "";
    printf("%s 입력\n", str1);
    printf("%d : 0 나오면 답\n", ft_str_is_numeric(str1));
    printf("%s 입력\n", str2);
    printf("%d : 1 나오면 답\n", ft_str_is_numeric(str2));
    printf("%s 비어있음\n", str3);
    printf("%d : 1 나오면 답\n", ft_str_is_numeric(str3));
}

5. ex04) ft_str_is_lowercase

#include <stdio.h>

int ft_str_is_lowercase(char *str);

int main(void)
{
    char str1[] = "exercise 04";
    char str2[] = "abcde";
    char str3[] = "";
    printf("%s 입력\n", str1);
    printf("%d : 0 나오면 답\n", ft_str_is_lowercase(str1));
    printf("%s 입력\n", str2);
    printf("%d : 1 나오면 답\n", ft_str_is_lowercase(str2));
    printf("%s 비어있음\n", str3);
    printf("%d : 1 나오면 답\n", ft_str_is_lowercase(str3));
}

6. ex05) ft_str_is_uppercase

#include <stdio.h>

int ft_str_is_uppercase(char *str);

int main(void)
{
    char str1[] = "exercise 05";
    char str2[] = "ABCDE";
    char str3[] = "";
    printf("%s 입력\n", str1);
    printf("%d : 0 나오면 답\n", ft_str_is_uppercase(str1));
    printf("%s 입력\n", str2);
    printf("%d : 1 나오면 답\n", ft_str_is_uppercase(str2));
    printf("%s 비어있음\n", str3);
    printf("%d : 1 나오면 답\n", ft_str_is_uppercase(str3));
}

7. ex06) ft_str_is_printable

#include <stdio.h>

int ft_str_is_printable(char *str);

int main(void)
{
    char str1[] = "\n";
    char str2[] = "exercise 06";
    char str3[] = "";
    printf("%s 입력\n", str1);
    printf("%d : 0 나오면 답\n", ft_str_is_printable(str1));
    printf("%s 입력\n", str2);
    printf("%d : 1 나오면 답\n", ft_str_is_printable(str2));
    printf("%s 비어있음\n", str3);
    printf("%d : 1 나오면 답\n", ft_str_is_printable(str3));
}

8. ex07) ft_strupcase

#include <stdio.h>

char    *ft_strupcase(char *str);

int main(void)
{
    char str[] = "hello world";

    printf("%s : Before\n", str);
    printf("%s : After\n", ft_strupcase(str));
}

9. ex08) ft_strlowcase

#include <stdio.h>

char    *ft_strlowcase(char *str);

int main(void)
{
    char str[] = "HELLO WORLD";

    printf("%s : Before\n", str);
    printf("%s : After\n", ft_strlowcase(str));
}

10. ex09) ft_strcapitalize

#include <stdio.h>

char    *ft_strcapitalize(char *str);

int main(void)
{
    char    str[] = "salut, comment tu vas ? 42mots quarante-deux; cinquante+et+un";

    printf("Before : %s\n", str);
    printf("After : %s\n답 : Salut, Comment Tu Vas ? 42mots Quarante-Deux; Cinquante+Et+Un\n", ft_strcapitalize(str));
}

11. ex10) ft_strlcpy

#include <stdio.h>
#include <string.h>

unsigned int ft_strlcpy(char *dest, char *src, unsigned int size);

int main(void)
{
    char dest[] = "aaaaaaaaaaaaaaaaaaaa";
    char src[] = "exercise10 is finished";

    printf("%u : src 길이는 22\n", ft_strlcpy(dest, src, 5));
    printf("%s : 복사된 dest\n", dest);
}

12. ex11) ft_putstr_non_printable

#include <stdio.h>

void    ft_putstr_non_printable(char *str);

int main(void)
{
    char    str[] = "Coucou\ntu vas bien ?";

    printf("Coucou\\ntu vas bien ?  : Before\n");
    ft_putstr_non_printable(str);
    printf(" : After \n\n");
    printf("Coucou\\0atu vas bien ? : 답\n");
}

13. ex12) ft_print_memory

#include <stdio.h>

void    *ft_print_memory(void *addr, unsigned int size);

int main(void)
{
    char    c12[] = "Bonjour les aminches\t\n\tc  est fou\ttout\tce qu on peut faire avec\t\n\tprint_memory\n\n\n\tlol.lol\n ";

    printf("----------answer----------\n");
    printf("%s\n", "00007ffee16ab3e0: 426f 6e6a 6f75 7220 6c65 7320 616d 696e Bonjour les amin\n00007ffee16ab3f0: 6368 6573 090a 0963 2020 6573 7420 666f ches...c  est fo\n00007ffee16ab400: 7509 746f 7574 0963 6520 7175 206f 6e20 u.tout.ce qu on \n00007ffee16ab410: 7065 7574 2066 6169 7265 2061 7665 6309 peut faire avec.\n00007ffee16ab420: 0a09 7072 696e 745f 6d65 6d6f 7279 0a0a ..print_memory..\n00007ffee16ab430: 0a09 6c6f 6c2e 6c6f 6c0a 2000           ..lol.lol. .");
    printf("-------------------------\n");
    ft_print_memory((void *)c12, sizeof(c12));
    printf("----------output----------\n");
    printf("< size = 0 인 경우 > : 아무것도 안 나와야 정답\n");
}

📁 vim C 환경설정

  1. vim의 42 header
  • 42 Header :사용자 정보, 생성 및 수정 날짜가 저장되어있는 주석 (일부 편집기에 플러그인으로 존재)
  1. configuration file 설정
  • ~/.zshrc 하단에 추가 (파일 없으면 생성)
  • export USER=soohykim
    export MAIL=$USER@student.42seoul.kr
  • 변경사항 적용
    source ./zshrc
  1. 실행
  • vim 열고 (1) ctrl+F1 (2) :Stdheader 입력

42 header 설정

📁 norminette

norminette [파일명].c (에러 없을 시 통과)

  • norminette : 42서울에서 사용하는 문법 규칙 프로그램 (틀리면 빨갛게 표시)
  • norminette 에러규칙

📁 moulinette의 컴파일 옵션

-Wall : 모든 모호한 코딩에 대해 경고 보냄
-Wextra : 원래는 무시할 경고 사항 -> warning으로 출력
-Werror : 모든 경고를 컴파일 중단하는 에러로 취급해서 경고 하나만 나와도 컴파일 중단, 모든 warning -> error로 출력 (warning이 하나라도 뜨면 컴파일X)

활성화시키는 warning 목록

  • "프로그램을 제출하세요"가 아닌 경우에는 함수만 제출
  • 문제에 "함수를 작성하세요" 라고 나온 경우 moulinette가 다음처럼 컴파일
    gcc -Werror -Wall -Wextra main.c ft_****.c
  • moulinette가 자체적으로 가지고 있는 main.c
extern void 함수명(void); // function_name을 외부에서 가져온다는 의미
int main(void)
{
    함수명();
}
  • 테스트를 해보려면 위와 같은 main.c를 만들고 동일한 옵션으로 컴파일 해보기

📁 참고

원래 알고있던 c 컴파일 방법 (사용x)

(컴파일) gcc -o [실행 파일][컴파일할 파일]
(실행) ./실행파일명

https://m.blog.naver.com/dolikart/222171904351

https://velog.io/@1984/c00

https://gksruf2848.tistory.com/15

728x90
반응형