aboutsummaryrefslogtreecommitdiff
path: root/c07
diff options
context:
space:
mode:
Diffstat (limited to 'c07')
-rw-r--r--c07/ex03/ft_strjoin.c37
-rw-r--r--c07/ex04/ft_convert_base.c130
-rw-r--r--c07/ex04/ft_convert_base2.c69
-rw-r--r--c07/ex05/ft_split.c46
-rw-r--r--c07/main.c56
5 files changed, 187 insertions, 151 deletions
diff --git a/c07/ex03/ft_strjoin.c b/c07/ex03/ft_strjoin.c
index ea97bb6..7801820 100644
--- a/c07/ex03/ft_strjoin.c
+++ b/c07/ex03/ft_strjoin.c
@@ -6,7 +6,7 @@
/* By: cacharle <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2019/07/07 16:14:25 by cacharle #+# #+# */
-/* Updated: 2019/07/09 09:08:52 by cacharle ### ########.fr */
+/* Updated: 2019/07/12 14:41:33 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -24,16 +24,11 @@ int my_strlen(char *str)
int cummulative_strlen(int size, char **strs)
{
- int i;
int len;
len = 0;
- i = 0;
- while (size > 0)
- {
- len += my_strlen(strs[size - 1]);
- size--;
- }
+ while (size-- > 0)
+ len += my_strlen(strs[size]);
return (len);
}
@@ -42,26 +37,24 @@ char *ft_strjoin(int size, char **strs, char *sep)
int i;
int j;
int k;
- int l;
char *join;
join = (char*)malloc(sizeof(char) * (cummulative_strlen(size, strs)
- + my_strlen(sep) * (size - 1) + 1));
+ + my_strlen(sep) * (size - (size == 0 ? 0 : 1) + 1)));
+ if (join == NULL)
+ return (NULL);
j = 0;
- l = 0;
- while (l < size)
+ k = 0;
+ while (k < size)
{
i = 0;
- while (strs[l][i])
- {
- join[j] = strs[l][i];
- i++;
- j++;
- }
- k = 0;
- while (l != size - 1 && sep[k])
- join[j++] = sep[k++];
- l++;
+ while (strs[k][i])
+ join[j++] = strs[k][i++];
+ i = 0;
+ while (k != size - 1 && sep[i])
+ join[j++] = sep[i++];
+ k++;
}
+ join[j] = '\0';
return (join);
}
diff --git a/c07/ex04/ft_convert_base.c b/c07/ex04/ft_convert_base.c
index f30c3e5..0abdbe8 100644
--- a/c07/ex04/ft_convert_base.c
+++ b/c07/ex04/ft_convert_base.c
@@ -6,118 +6,60 @@
/* By: cacharle <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2019/07/08 16:16:53 by cacharle #+# #+# */
-/* Updated: 2019/07/10 06:37:09 by cacharle ### ########.fr */
+/* Updated: 2019/07/12 12:07:28 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
-int check_base(char *base)
-{
- int i;
- int j;
-
- i = 0;
- while (base[i])
- {
- if (base[i] == '-' || base[i] == '+' || base[i] == ' '
- || base[i] == '\t' || base[i] == '\n' || base[i] == '\v'
- || base[i] == '\f' || base[i] == '\r')
- return (0);
- j = 0;
- while (base[j])
- {
- if (j != i && base[j] == base[i])
- return (0);
- j++;
- }
- i++;
- }
- if (i < 2)
- return (0);
- return (1);
-}
-
-int ft_pow(int base, int exponent)
-{
- int accumulator;
-
- accumulator = 1;
- while (exponent-- > 0)
- accumulator *= base;
- return (accumulator);
-}
-
-
-int position_in_base(char digit, char *base)
-{
- int i;
+#include <stdlib.h>
- i = 0;
- while (base[i] != digit)
- i++;
- return (i);
-}
+int check_base(char *base);
+int ft_pow(int base, int exponent);
+int position_in_base(char digit, char *base);
+int some_strlen(char *str);
-// CHECK THE STR NOT JUST THE BASE (you idiot)
-int ft_atoi_base(char *str, char *base)
+int from_base(char *str, char *base)
{
int radix;
int i;
int j;
int nb;
+ int is_negative;
- if (!check_base(base))
- return (0);
+ while (*str == ' ' || *str == '\t' || *str == '\n'
+ || *str == '\v' || *str == '\f' || *str == '\r')
+ str++;
+ is_negative = 0;
+ while (*str == '-' || *str == '+')
+ if (*str++ == '-')
+ is_negative = !is_negative;
nb = 0;
radix = 0;
while (base[radix])
radix++;
i = 0;
- while (str[i])
+ while (position_in_base(str[i], base) != -1)
i++;
j = 0;
while (--i >= 0)
- {
- nb += ft_pow(radix, i) * position_in_base(str[j], base);
- j++;
- }
- return (nb);
-}
-
-int some_strlen(char *str)
-{
- int counter;
-
- counter = 0;
- while (str[counter])
- counter++;
- return (counter);
+ nb += ft_pow(radix, i) * position_in_base(str[j++], base);
+ return (is_negative ? -nb : nb);
}
-char *to_base(int nbr, char *base)
+char *to_base(int nbr, char *base, int radix, int is_negative)
{
- int radix;
int i;
+ int j;
unsigned int nbu;
char rev_digits[1024];
char *ret;
- int j;
- int is_negative;
- /*if (!check_base(base))*/
- /*return (NULL);*/
- radix = some_strlen(base);
nbu = nbr;
- is_negative = 0;
- if (nbr < 0)
- {
- is_negative = 1;
+ if (is_negative)
nbu = -nbr;
- }
- i = 0;
- printf("%d %s %d\n", radix, base, nbr);
+ i = nbu == 0 ? 1 : 0;
+ rev_digits[0] = base[0];
while (nbu > 0)
{
- printf("%u\n", nbu % radix);
rev_digits[i] = base[nbu % radix];
nbu /= radix;
i++;
@@ -125,27 +67,21 @@ char *to_base(int nbr, char *base)
ret = malloc(sizeof(char) * i + (is_negative ? 1 : 0));
j = 0;
if (is_negative)
- {
ret[0] = '-';
- j++;
- }
- while (i-- > 0)
- ret[j++] = rev_digits[i];
+ while (i-- + (is_negative ? 1 : 0) > 0)
+ ret[j++ + (is_negative ? 1 : 0)] = rev_digits[i];
ret[j] = '\0';
- for (int i = 0; i < 4; i++)
- printf("%c ", rev_digits[i]);
- printf("\n");
- for (int i = 0; i < 4; i++)
- printf("%c ", ret[i]);
- printf("\n");
return (ret);
}
char *ft_convert_base(char *nbr, char *base_from, char *base_to)
{
- int converted_nb;
-
- int nb;
- return NULL;
-
+ int nb;
+ char *parsed_nbr;
+
+ if (!check_base(base_from) || !check_base(base_to))
+ return (NULL);
+ parsed_nbr = nbr;
+ nb = from_base(parsed_nbr, base_from);
+ return (to_base(nb, base_to, some_strlen(base_to), nb < 0));
}
diff --git a/c07/ex04/ft_convert_base2.c b/c07/ex04/ft_convert_base2.c
index e69de29..be9a03e 100644
--- a/c07/ex04/ft_convert_base2.c
+++ b/c07/ex04/ft_convert_base2.c
@@ -0,0 +1,69 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_convert_base2.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/07/10 20:22:09 by cacharle #+# #+# */
+/* Updated: 2019/07/11 10:10:08 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+int check_base(char *base)
+{
+ int i;
+ int j;
+
+ i = 0;
+ while (base[i])
+ {
+ if (base[i] == '-' || base[i] == '+' || base[i] == ' '
+ || base[i] == '\t' || base[i] == '\n' || base[i] == '\v'
+ || base[i] == '\f' || base[i] == '\r')
+ return (0);
+ j = 0;
+ while (base[j])
+ {
+ if (j != i && base[j] == base[i])
+ return (0);
+ j++;
+ }
+ i++;
+ }
+ if (i < 2)
+ return (0);
+ return (1);
+}
+
+int ft_pow(int base, int exponent)
+{
+ int accumulator;
+
+ accumulator = 1;
+ while (exponent-- > 0)
+ accumulator *= base;
+ return (accumulator);
+}
+
+int position_in_base(char digit, char *base)
+{
+ int i;
+
+ i = 0;
+ while (digit != base[i] && base[i])
+ i++;
+ if (base[i] == '\0')
+ return (-1);
+ return (i);
+}
+
+int some_strlen(char *str)
+{
+ int counter;
+
+ counter = 0;
+ while (str[counter])
+ counter++;
+ return (counter);
+}
diff --git a/c07/ex05/ft_split.c b/c07/ex05/ft_split.c
index 956782f..3ff2e43 100644
--- a/c07/ex05/ft_split.c
+++ b/c07/ex05/ft_split.c
@@ -6,7 +6,7 @@
/* By: cacharle <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2019/07/08 15:58:03 by cacharle #+# #+# */
-/* Updated: 2019/07/09 12:42:21 by cacharle ### ########.fr */
+/* Updated: 2019/07/13 08:15:31 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -24,41 +24,51 @@ int count_segment(char *str, char *charset)
{
int counter;
- counter = 1;
+ counter = 0;
while (*str)
{
- if (in_charset(*str, charset))
+ if (!in_charset(*str, charset))
+ {
counter++;
+ while (!in_charset(*str, charset) && *str)
+ str++;
+ if (!*str)
+ break ;
+ }
str++;
}
return (counter);
}
-char **ft_split(char *str, char *charset)
+char **heck(char *str, char *charset, char *tmp, int i)
{
char **strs;
- char *tmp;
- int i;
int j;
- int k;
- strs = (char**)malloc(sizeof(char*) * (count_segment(str, charset) + 1));
- printf("%d\n", count_segment(str, charset));
- k = 0;
+ if ((strs = (char**)malloc(sizeof(char*)
+ * (count_segment(str, charset) + 1))) == NULL)
+ return (NULL);
+ j = 0;
while (*str)
{
+ while (in_charset(*str, charset))
+ str++;
i = 0;
- while (!in_charset(str[i], charset))
+ while (!in_charset(str[i], charset) && str[i])
i++;
- tmp = (char*)malloc(sizeof(char) * i);
- if (tmp == NULL)
- printf("bonjour");
+ if ((tmp = (char*)malloc(sizeof(char) * i + 1)) == NULL)
+ return (NULL);
i = 0;
- while (!in_charset(*str, charset))
+ while (!in_charset(*str, charset) && *str)
tmp[i++] = *str++;
- strs[k++] = tmp;
- str++;
+ tmp[i] = '\0';
+ strs[j++] = tmp;
}
- strs[k] = 0;
+ strs[j] = 0;
return (strs);
}
+
+char **ft_split(char *str, char *charset)
+{
+ return (heck(str, charset, NULL, 0));
+}
diff --git a/c07/main.c b/c07/main.c
index 729720b..e85f111 100644
--- a/c07/main.c
+++ b/c07/main.c
@@ -6,6 +6,7 @@
#include "ex02/ft_ultimate_range.c"
#include "ex03/ft_strjoin.c"
#include "ex04/ft_convert_base.c"
+#include "ex04/ft_convert_base2.c"
#include "ex05/ft_split.c"
int main()
@@ -37,28 +38,55 @@ int main()
printf("---------------\n");
char *strs[] = {"bon", "je", "suis", "charles"};
- char *sep = ", ";
+ char *sep = "%&^";
int size = 4;
char *join;
join = ft_strjoin(size, strs, sep);
printf("[%d] %s\n", my_strlen(join), join);
- /*for (int i = 0; i < my_strlen(join) + 1; i++)*/
- /*printf("%d ", join[i]);*/
+ for (int i = 0; i < my_strlen(join) + 1; i++)
+ printf("%d ", join[i]);
free(join);
printf("\n---------------\n");
- printf("%s\n", ft_convert_base("101010", "01", "0123456789"));
- printf("%s\n", to_base(34, "10"));
+ char *converted;
+ converted = ft_convert_base("-101010", "01", "0123456789");
+ printf("%s\n", converted);
+ free(converted);
+ converted = ft_convert_base(" -+1010102345678ff", "01", "0123456789abcdef");
+ printf("%s\n", converted);
+ free(converted);
+ converted = ft_convert_base(" \t\f\v +34589qw", "01234567", "012");
+ printf("%s\n", converted);
+ free(converted);
+ converted = ft_convert_base(" \t\f\v +asdf", "fgh", ".?");
+ printf("%s\n", converted);
+ free(converted);
+ printf("%s\n", ft_convert_base(" \t\f\v +34589qw", "01234567", "0+12"));
+ printf("%s\n", ft_convert_base(" \t\f\v +34589qw", "01234567", "012 "));
+ printf("%s\n", ft_convert_base(" \t\f\v +34589qw", "012345-67", "012"));
+ printf("%s\n", ft_convert_base(" \t\f\v +34589qw", "012\t34567", "012"));
+ printf("%s\n", ft_convert_base(" \t\f\v +34589qw", "0", "012"));
+ printf("%s\n", ft_convert_base(" \t\f\v +34589qw", "01", ""));
+ printf("%s\n", ft_convert_base(" \t\f\v +34w", "01", "0123456789"));
+ printf("%s\n", ft_convert_base(" \t\f\v +34w", "01", "!?"));
- /*printf("\n---------------\n");*/
- /*char *str = "bon.je.suis,asdofoisafj.ladjsf";*/
- /*char *charset = "";*/
- /*char **sstrs = ft_split(str, charset);*/
- /*for (int i = 0; sstrs[i] != 0; i++)*/
- /*printf("%s\n", sstrs[i]);*/
- /*for (int i = 0; sstrs[i] != 0; i++)*/
- /*free(sstrs[i]);*/
- /*free(sstrs);*/
+ printf("\n---------------\n");
+ char *const str = "3YaZkAP30iGoBWv L asdf h LbpX8Hx FWHwB2u1FH0S5";
+ char *begin = "\n \t hgonjour";
+ char *end = "jesuis\n\t hhh";
+ char *empty = "";
+ char *charset = "\n\t ";
+ char **sstrs = ft_split(begin, charset);
+ for (int i = 0; i < count_segment(begin, charset) + 1; i++)
+ {
+ printf("\n%s: ", sstrs[i]);
+ /*for (int j = 0; j < 10; j++)*/
+ /*printf("%d ", sstrs[i][j]);*/
+ }
+ if (sstrs)
+ for (int i = 0; sstrs[i] != 0; i++)
+ free(sstrs[i]);
+ free(sstrs);
return 0;
}