[push_swap] 파싱

J_JEON·2022년 7월 27일
0

push_swap

목록 보기
3/6
  • push_swap에서는 처음 시작할때 정렬해야할 음수, 양수, 0 의 값들을 받아온 뒤 유효한 값들을 a배열에 순서대로 넣어주어야함
  • 이때 다양한 형식, 숫자 이외의 문자 등등의 여러가지 값들이 들어올 수 있기때문에 이러한 값들을 잘 선별해주어야함

구현해야 할것

  • 2 1 3 같은 형식이아닌 "2 1 3"처럼 하나의 문자열로 들어오는것도 받아줘야함
  • 2 "1 3" 6 5 같이 섞여 들어와도 받아줘야함
  • 음수가 들어와도 받아줘야함
  • 숫자 이외의 문자가 들어올 시 에러
  • 아무런 값이 들어오지 않을 시 에러
  • 중복된 값이 들어올 시 에러

예시

$> ./push_swap 2 1 3 6 5 -8
$> ./push_swap 2 1 3 6 5 8 3
Error
$> ./push_swap "2 -1 -3 6" 5 8
$> ./push_swap 2 "1 3 6 two" 5 8
Error
$> ./push_swap 2 "1 3" 6 -5 8
$> ./push_swap 2 1 3 6 5 one 8
Error

구현

무결성 검사

int	check_argv(int argc, char **argv) // 받아온 값들이 유효한 값들인지 검사하는 함수
{
	int		i;
	char	*str;

	i = 1;
	if (argc == 1) // 받아온 값이 없다면
		return (return_error("Error")); // 에러출력하고 종료
	while (i != argc)
	{
		str = argv[i];
		while (*str)
		{
			if (*str == '-' || *str == '+' ) // 현재 문자가 - 또는 +라면
			{
				str++;
				if (*str < '0' || *str > '9') // 다음 문자는 숫자여야함, 아니라면 에러
					return (return_error("Error"));
			}
			else if (*str != ' ' && (*str < '0' || *str > '9'))
            // 현재 문자가 띄워쓰기 또는 숫자가 아니라면
				return (return_error("Error")); // 에러
			if (*str)
				str++;
		}
		i++;
	}
	return (0); // 모든 값이 유효하다면 0을 반환
}

Deque에 값 저장

int	push_in_deq(int argc, char **argv, t_deque *deq)
// deque에 받아온 값들을 순서대로 저장하는 함수
{
	int		i;

	i = 1;
	while (i != argc)
	{
		if (check_str_num(argv[i]))
        // 현재 보고있는 argv[i]가 "1 2 3" 형식으로 받아온 데이터인지 아닌지 확인
		{
			if (push_node_for_list(deq, argv[i]))
            // "1 2 3"형식으로 받아온 데이터를 쪼개서 deque에 저장하는 함수
				return (1);
		}
		else
		{
			if (push_node_back(deq, ft_atoi(argv[i])))
            // "1 2 3" 형식이 아니라면 deque의 마지막에 데이터를 추가해줌
				return (1);
		}
		i++;
	}
	return (0);
}

int	push_node_for_list(t_deque *deq, char *argv)
// "1 2 3"형식으로 받아온 데이터를 1 2 3 각각의 값으로 나눠 deque에 저장해주는 함수
{
	char	**num_list;
	int		i;

	i = 0;
	num_list = ft_split(argv, ' '); // ft_split함수를 사용하여 띄워쓰기를 기준으로 쪼개줌
	if (num_list == NULL)
		return (1);
	while (num_list[i] != NULL) // 쪼개준 각각의 값들을 순회
	{
		if (push_node_back(deq, ft_atoi(num_list[i]))) 
        // 해당하는 값을 이용해 deque의 마지막에 데이터를 추가해줌
		{
			free_list(num_list);
			return (1);
		}
		i++; // 순회
	}
	free_list(num_list);
    // split은 메모리를 할당받은 문자열을 반환하므로 사용이 끝난 문자열을 free해줌
	return (0);
}
profile
늅늅

0개의 댓글