#include <unistd.h>

char    *ft_space_first(char *str)
{
    int i;
    
    i = 0;

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

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

	i = 0;
  ft_space_first(str);
    

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

}

int main() {

    char arr[] = "salut, comment tu vas ? 42mots quarante-deux; cinquante+et+un";
    
    ft_strcapitalize(arr);

    printf("%s", arr);
    
    return 0;
}
//norminette 때문에 수정한 코드

#include <unistd.h>

char	*ft_space_first(char *str)
{
	int	i;

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

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

	i = 0;
	ft_space_first(str);
	while (str[i] != '\\0')
	{
		if (str[i] > 32 && str[i] < 127)
		{
			if (!(str[i] > 47 && str[i] < 57))
			{
				if (!(str[i] >= 'a' && str[i] <= 'z'))
				{
					if (!(str[i] >= 'A' && str[i] <= 'Z'))
					{
						if (str[i + 1] >= 'a' && str[i + 1] <= 'z')
							str[i + 1] = str[i + 1] - 32;
					}
				}
			}
		}
		i++;
	}
	return (str);
}

#include <stdio.h>
int main(void)
{
    char a[] = "salut, comment tu vas ? 42mots quarante-deux; cinquante+et+un";
    printf("%s", ft_strcapitalize(a));
}

수정 사항: 문장 중간에 대문자가 갑자기 나오는 부분에서는 문자 변환이 이루어지지 않는다.

수정한 코드: ft_upp_to_low()이란 함수를 통해 우선 전체적으로 문장의 알파벳을 소문자로 만들어준다.

#include <unistd.h>

char	*ft_low_to_upp(char *str)
{
	int	i;

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

char	*ft_space_first(char *str)
{
	int	i;

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

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

	i = 0;
	ft_low_to_upp(str);
	ft_space_first(str);
	while (str[i] != '\\0')
	{
		if (str[i] > 32 && str[i] < 127)
		{
			if (!(str[i] >= '0' && str[i] <= '9'))
			{
				if (!(str[i] >= 'a' && str[i] <= 'z'))
				{
					if (!(str[i] >= 'A' && str[i] <= 'Z'))
					{
						if (str[i + 1] >= 'a' && str[i + 1] <= 'z')
							str[i + 1] = str[i + 1] - 32;
					}
				}
			}
		}
		i++;
	}
	return (str);
}

이상하게 다른 평가자분들은 논리적인 면에서 맞다고 하시는데 기계채점에서 KO가 떠버렸다.

왜인지는 이유를 아직 모르겠지만, 잘못적은 함수명을 수정했다.

그리고 혹시 몰라 int i의 값의 기본 값을 1로 수정했다.

#include <unistd.h>

char	*ft_upp_to_low(char *str)
{
	int	i;

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

char	*ft_space_first(char *str)
{
	int	i;

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

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

	i = 1;
	ft_upp_to_low(str);
	ft_space_first(str);
	while (str[i] != '\\0')
	{
		if (str[i - 1] > 32 && str[i - 1] < 127)
		{
			if (!(str[i - 1] >= '0' && str[i - 1] <= '9'))
			{
				if (!(str[i - 1] >= 'a' && str[i - 1] <= 'z'))
				{
					if (!(str[i - 1] >= 'A' && str[i - 1] <= 'Z'))
					{
						if (str[i] >= 'a' && str[i] <= 'z')
							str[i] = str[i] - 32;
					}
				}
			}
		}
		i++;
	}
	return (str);
}

// c02 test code - made by kyungjle

#include <stdio.h>

char *ft_strcapitalize(char *str);

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

예외 사항 발견 : tab이나 \n 등 비출력 문자가 앞에 오면 소문자가 대문자로 바뀌지 않는 현상 존재.

예외 사항을 반영한 코드

#include <unistd.h>

char	*ft_upp_to_low(char *str)
{
	int	i;

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

char	*ft_space_first(char *str)
{
	int	i;

	i = 1;
	if (str[0] >= 'a' && str[0] <= 'z')
		str[0] = str[0] - 32;
	return (str);
}

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

	i = 1;
	ft_upp_to_low(str);
	ft_space_first(str);
	while (str[i] != '\\0')
	{
		if (str[i - 1] > 0 && str[i - 1] < 127)
		{
			if (!('0' <= str[i - 1] && str[i - 1] <= '9'))
			{
				if (!('a' <= str[i - 1] && str[i - 1] <= 'z'))
				{
					if (!('A' <= str[i - 1] && str[i - 1] <= 'Z'))
					{
						if (str[i] >= 'a' && str[i] <= 'z')
							str[i] = str[i] - 32;
					}
				}
			}
		}
		i++;
	}
	return (str);
}

// c02 test code - made by kyungjle

#include <stdio.h>

//char *ft_strcapitalize(char *str);

int main(void)
{
	char str[] = "salut, comment tu vas ? 42Mots quarante-deux; cinquante+et+un";
	printf("%s\\n", str);
	printf("===========\\n");
	printf("%s\\n", ft_strcapitalize(str));
}