c02 - KimTaebin-ai/study_posts GitHub Wiki

string νƒ€μž…μ˜ 처리 방법과 string.h 헀더 파일의 ν•¨μˆ˜λ“€μ„ λ‹€λ£¨λŠ” 문제

(ascii μ½”λ“œμ˜ 이해와 ν™œμš© 방법도 μš”κ΅¬ν•¨)

ex00

#include <unistd.h>

char	*ft_strcpy(char *dest, char *src)
{
	int	i;

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

c02λΆ€ν„°λŠ” stirng.h νŒŒμΌμ— μžˆλŠ” ν•¨μˆ˜μ— λŒ€ν•œ 이해가 ν•„μš”ν•¨

ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό 직접 κ΅¬ν˜„ν•˜λΌλŠ” λ¬Έμ œλ“€μ΄ νŠ€μ–΄λ‚˜μ˜΄

string copy 의 μ€„μž„λ§. 즉, λ¬Έμžμ—΄μ„ λ³΅μ‚¬ν•˜λŠ” ν•¨μˆ˜

string 은 c00, 01 μ—μ„œλ„ μ•½κ°„ λ‹€λ€˜μ§€λ§Œ char의 문자 배열을 μ˜λ―Έν•¨

λ‹€λ§Œ λ¬Έμžμ—΄μ˜ 끝은 \0 이기 λ•Œλ¬Έμ— length 을 μ•Œμ•„λ‚Έ ν›„ μ΄ˆκΈ°ν™” μ‹œμΌœμ€˜μ•Ό 함

ex01

#include <unistd.h>

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

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

이전 λ¬Έμ œμ—μ„œ n 이 뢙은 ν•¨μˆ˜μž„

n 은 numberλ₯Ό λœ»ν•˜λ©°

origin 에 μžˆλŠ” λ¬Έμžμ—΄μ„ dest둜 볡사λ₯Ό ν•˜λŠ”λ°, n 만큼 λ³΅μ‚¬ν•˜λŠ” ν•¨μˆ˜λΌλŠ” 뜻

ex02

#include <unistd.h>

int	ft_str_is_alpha(char *str)
{
	int	i;
	int	is_true;

	i = 0;
	is_true = 1;
	while (str[i] != '\0')
	{
		if (str[i] >= 'a' && str[i] <= 'z')
			i++;
		else if (str[i] >= 'A' && str[i] <= 'Z')
			i++;
		else
			is_true = 0;
			break ;
	}
	return (is_true);
}

μ•ŒνŒŒλ²³μ΄λ‹€ = 1, 곡백이닀 = 1, μ•„λ‹ˆλ‹€ = 0

μ•„μŠ€ν‚€ μ½”λ“œ 자체λ₯Ό 넣어도 λ˜κΈ΄ν•˜λ‚˜ c00 μ—μ„œ ν’€μ—ˆλ˜ κ²ƒμ²˜λŸΌ

β€˜β€™ λ₯Ό 톡해 ν•΄κ²° κ°€λŠ₯함

ex03

#include <unistd.h>

int	ft_str_is_numeric(char *str)
{
	int	i;
	int	is_num;

	i = 0;
	is_num = 1;
	while (str[i] != '\0')
	{
		if (str[i] < '0' || str[i] > '9')
		{
			is_num = 0;
			break ;
		}
		i++;
	}
	return (is_num);
}

ex04

#include <unistd.h>

int	ft_str_is_lowercase(char *str)
{
	int	i;
	int	is_lowercase;

	i = 0;
	is_lowercase = 1;
	while (str[i] != '\0')
	{
		if (str[i] < 'a' || str[i] > 'z')
		{
			is_lowercase = 0;
			break ;
		}
		i++;
	}
	return (is_lowercase);
}

ex05

#include <unistd.h>

int	ft_str_is_uppercase(char *str)
{
	int	i;
	int	is_uppercase;

	i = 0;
	is_uppercase = 1;
	while (str[i] != '\0')
	{
		if (str[i] < 'A' || str[i] > 'Z')
		{
			is_uppercase = 0;
			break ;
		}
		i++;
	}
	return (is_uppercase);
}

ex06

#include <unistd.h>

int	ft_str_is_printable(char *str)
{
	int	i;
	int	is_printable;

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

printable 의 의미λ₯Ό μ²˜μŒμ— λ– μ˜¬λ¦¬κΈ° μ–΄λ €μšΈ 수 μžˆλŠ”λ° κ΅¬κΈ€λ§μœΌλ‘œ λ‹¨λ²ˆμ— μ°Ύμ•„λƒˆλ‹€

μ•„μŠ€ν‚€ ν…Œμ΄λΈ”μ„ 보면 32(곡백) ~ 126κΉŒμ§€ μž…λ ₯ κ°€λŠ₯ν•œ λ¬Έμžμž„

쑰건식을 ν•΄λ‹Ή μ•„μŠ€ν‚€μ½”λ“œλ‘œ μž‘μ„±ν•˜λ©΄ μ‰½κ²Œ 풀이가λŠ₯ν•œ 문제

ex07

#include <unistd.h>

char	*ft_strupcase(char *str)
{
	int	i;
	int	tr;

	i = 0;
	tr = 'A' - 'a';
	while (str[i] != '\0')
	{
		if (str[i] >= 'a' && str[i] <= 'z')
		{
			str[i] += tr;
		}
		i++;
	}
	return (str);
}

07, 08λ¬Έμ œμ—μ„œ μ†Œλ¬Έμža - λŒ€λ¬ΈμžA 값을 λΊ€ 값을 μƒμˆ˜λ‘œ 집어 λ„£λŠ” 뢄듀이 많이 있음

λ‚˜λ„ 졜초 μ œμΆœμ—μ„  32 값을 ν†΅μœΌλ‘œ 집어 λ„£μ—ˆλŠ”λ°, '맀직 λ„˜λ²„' μ΄μŠˆκ°€ λ°œμƒν•  수 μžˆλ‹€κ³  ν•œλ‹€

μ•žμœΌλ‘œ ν‘ΈλŠ” λ¬Έμ œμ—μ„œ λ§Žμ€ 도움이 λ˜μ—ˆμŒ

ex08

#include <unistd.h>

char	*ft_strlowcase(char *str)
{
	int	i;
	int	tr;

	i = 0;
	tr = 'a' - 'A';
	while (str[i] != '\0')
	{
		if (str[i] >= 'A' && str[i] <= 'Z')
		{
			str[i] += tr;
		}
		i++;
	}
	return (str);
}

ex09

#include <unistd.h>

int	is_char(char c)
{
	return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0'
			&& c <= '9'));
}

void	capitalize_char(char *c, int *new_word)
{
	if (*new_word && *c >= 'a' && *c <= 'z')
		*c -= ('a' - 'A');
	else if (!*new_word && *c >= 'A' && *c <= 'Z')
		*c += ('a' - 'A');
	*new_word = 0;
}

char	*ft_strcapitalize(char *str)
{
	int	i;
	int	new_word;

	i = 0;
	new_word = 1;
	while (str[i] != '\0')
	{
		if (is_char(str[i]))
			capitalize_char(&str[i], &new_word);
		else
			new_word = 1;
		i++;
	}
	return (str);
}

단어 λ‹¨μœ„λ‘œ ꡬ뢄지어 λ‹¨μ–΄μ˜ 첫 번째 κΈ€μžλŠ” λŒ€λ¬Έμžλ‘œ λ³€κ²½, 첫번째 κΈ€μžκ°€ μ•„λ‹ˆλΌλ©΄ μ†Œλ¬Έμžλ‘œ λ³€κ²½

λ‹¨μ–΄μ˜ 기쀀은 λ„μ–΄μ“°κΈ°λ‘œλ§Œ ꡬ뢄 μ§“λŠ”λ‹€κ³  착각할 수 μžˆλ‹€.

κ·ΈλŸ¬λ‚˜ 좜λ ₯ κ²°κ³Όλ₯Ό μžμ„Ένžˆ 보면 특수문자 μ΄ν›„λ‘œλ„ λŒ€λ¬Έμžλ‘œ λ³€κ²½λ˜λŠ” κ±Έ 확인할 수 μžˆλ‹€

is_char ν•¨μˆ˜λ₯Ό ν†΅ν•΄μ„œ μž…λ ₯된 값이 aAzZ, 09 κΉŒμ§€μ˜ 값이 μ•„λ‹ˆλΌλ©΄ 특수문자둜 νŒλ‹¨. Flag κ΅¬ν˜„

μœ„ ν•¨μˆ˜λ₯Ό 톡해 얻은 Flag κ°’μœΌλ‘œ capitalize_char μ—μ„œ λŒ€μ†Œλ¬Έμž λ³€κ²½

ν†΅κ³‘μ˜ λ²½ μ‹œμž‘μ΄λ‹€.

μ΄μ „κΉŒμ§„ 평균적인 집쀑λ ₯, ν• μ• ν•˜λŠ” μ‹œκ°„μ— 따라 μ„ λ°œλŒ€κ°€ μ •ν•΄μ‘Œλ‹€λ©΄

μ—¬κΈ°μ„œλΆ€ν„°λŠ” 09~11κΉŒμ§€ μ–Όλ§ˆλ‚˜ μ‹œλ„νšŸμˆ˜κ°€ μ λŠλƒμ— 따라 μ„ λ°œλŒ€κ°€ κ²°μ •λœλ‹€.

ex10

#include <unistd.h>

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

	i = 0;
	len = 0;
	while (src[i] != '\0')
	{
		i++;
	}
	len = i;
	if (size == 0)
	{
		return (len);
	}
	i = 0;
	while (src[i] != '\0' && i + 1 < size)
	{
		dest[i] = src[i];
		i++;
	}
	dest[i] = '\0';
	return (len);
}

μœ„μ—μ„œ ν–ˆλ˜ strcpy 와 동일함

λ‹€λ§Œ l (= length) κ°€ 듀어감

λ˜ν•œ λ§ˆμ§€λ§‰μ— \0 값을 보μž₯ν•΄μ€Œ

size -1 만큼 λ³΅μ‚¬ν•œ λ’€ src의 길이λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μž„

즉 ν•˜λŠ” 역할이 크게 2κ°œλΌλŠ” 뜻

  1. return 은 src의 길이λ₯Ό λ°˜ν™˜
  2. size만큼 src의 값을 dest둜 볡사

ex11

#include <unistd.h>

void	ft_putstr_non_printable(char *str)
{
	int		i;
	int		n1;
	int		n2;
	char	*hex;

	i = 0;
	hex = "0123456789abcdef";
	while (str[i] != '\0')
	{
		if ((unsigned char)str[i] < 32 || (unsigned char)str[i] > 126)
		{
			n1 = (unsigned char)str[i] / 16;
			n2 = (unsigned char)str[i] % 16;
			write(1, "\\", 1);
			write(1, &hex[n1], 1);
			write(1, &hex[n2], 1);
		}
		else
		{
			write(1, &str[i], 1);
		}
		i++;
	}
}

16μ§„μˆ˜μ΄λ―€λ‘œ 2자리수 ν‘œν˜„ ν•„μš”

λ˜ν•œ 문제λ₯Ό μžμ„Ένžˆ 읽어보면 lowercase라고 λͺ…μ‹œκ°€ λ˜μ–΄μžˆλ‹€!

ex12

#include <unistd.h>

void	print_hex(unsigned char c)
{
	char	*hex_digits;

	hex_digits = "0123456789abcdef";
	write(1, &hex_digits[c / 16], 1);
	write(1, &hex_digits[c % 16], 1);
}

void	print_address(unsigned long addr)
{
	char	hex_digits[16];
	int		i;
	int		j;

	i = 15;
	j = 0;
	while (i >= 0)
	{
		hex_digits[i--] = "0123456789abcdef"[addr % 16];
		addr /= 16;
	}
	while (j < 16)
	{
		write(1, &hex_digits[j], 1);
		j++;
	}
}

void	print_memory_line(unsigned char *addr, unsigned int size)
{
	unsigned int	i;

	i = 0;
	while (i < 16)
	{
		if (i < size)
			print_hex(addr[i]);
		else
			write(1, "  ", 2);
		if (i % 2)
			write(1, " ", 1);
		i++;
	}
	i = 0;
	while (i < size)
	{
		if (addr[i] >= 32 && addr[i] <= 126)
			write(1, &addr[i], 1);
		else
			write(1, ".", 1);
		i++;
	}
}

void	*ft_print_memory(void *addr, unsigned int size)
{
	unsigned int	i;
	unsigned int	line_size;

	if (size == 0)
		return (addr);
	i = 0;
	while (i < size)
	{
		print_address((unsigned long)(addr + i));
		write(1, ": ", 2);
		if (size - i < 16)
			line_size = size - i;
		else
			line_size = 16;
		print_memory_line((unsigned char *)addr + i, line_size);
		write(1, "\n", 1);
		i += 16;
	}
	return (addr);
}

걍 μ΄λ†ˆλ“€μ€ 진법 λ³€ν™˜μ„ μ‚¬λž‘ν•¨;;

⚠️ **GitHub.com Fallback** ⚠️