42서울 라피신 1주차 (C00~C02)
📒 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 환경설정
- vim의 42 header
- 42 Header :사용자 정보, 생성 및 수정 날짜가 저장되어있는 주석 (일부 편집기에 플러그인으로 존재)
- configuration file 설정
- ~/.zshrc 하단에 추가 (파일 없으면 생성)
- export USER=soohykim
export MAIL=$USER@student.42seoul.kr - 변경사항 적용
source ./zshrc
- 실행
- vim 열고 (1) ctrl+F1 (2) :Stdheader 입력
📁 norminette
norminette [파일명].c (에러 없을 시 통과)
- norminette : 42서울에서 사용하는 문법 규칙 프로그램 (틀리면 빨갛게 표시)
- norminette 에러규칙
📁 moulinette의 컴파일 옵션
-Wall : 모든 모호한 코딩에 대해 경고 보냄
-Wextra : 원래는 무시할 경고 사항 -> warning으로 출력
-Werror : 모든 경고를 컴파일 중단하는 에러로 취급해서 경고 하나만 나와도 컴파일 중단, 모든 warning -> error로 출력 (warning이 하나라도 뜨면 컴파일X)
- "프로그램을 제출하세요"가 아닌 경우에는 함수만 제출
- 문제에 "함수를 작성하세요" 라고 나온 경우 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 [실행 파일][컴파일할 파일]
(실행) ./실행파일명