Здание : Вывести слова в предложении обратном порядке ( agrv[1])
Задача - элементарна - вывести слова поданные в виде первого аргумента в обратном порядке.
Assignment name : rev_wstr
Expected files : rev_wstr.c
Allowed functions: write, malloc, free
--------------------------------------------------------------------------------
Write a program that takes a string as a parameter, and prints its words in
reverse order.
A "word" is a part of the string bounded by spaces and/or tabs, or the
begin/end of the string.
If the number of parameters is different from 1, the program will display
'\n'.
In the parameters that are going to be tested, there won't be any "additional"
spaces (meaning that there won't be additionnal spaces at the beginning or at
the end of the string, and words will always be separated by exactly one space).
Examples:
$> ./rev_wstr "You hate people! But I love gatherings. Isn't it ironic?" | cat -e
ironic? it Isn't gatherings. love I But people! hate You$
$>./rev_wstr "abcdefghijklm"
abcdefghijklm
$> ./rev_wstr "Wingardium Leviosa" | cat -e
Leviosa Wingardium$
$> ./rev_wstr | cat -e
$
$>
я над этой задачкой на экзе просидел 2 часа, никак не мог понять почему и что не работает ( выдавал ошибку типо object changed after being freed ( Что, каво?) сейчас запустил в gdb online - работает как швейцарские часы. Делал через стэк, в итоге плюнул и сделал через массив. Но все равно хочу понять почему это не работало на экзе.
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* rev_wstr.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: exam <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/21 11:16:21 by exam #+# #+# */
/* Updated: 2020/02/21 12:53:58 by exam ### ########.fr */
/* */
/* ************************************************************************** */
#include "stdlib.h"
#include "unistd.h"
int ft_isspace(char c);
int ft_strlen(char *str)
{
int len;
len = 0;
while (!(ft_isspace(str[len])))
len++;
return (len);
}
int ft_strlen_full(char *str)
{
int len;
len = 0;
while (str[len])
len++;
return (len);
}
void ft_putchar(char c)
{
write(1, &c, 1);
}
void ft_putstr(char *str)
{
write(1, str, ft_strlen(str));
}
char *ft_strcpy(char *dest,char *src)
{
int i;
i = -1;
while (src[++i])
dest[i] = src[i];
dest[i] = '\0';
return dest;
}
char *ft_strdup(char* src)
{
int len;
char *out;
len = ft_strlen(src);
out = (char*)malloc((len + 1) * sizeof(char));
ft_strcpy(out,src);
return (out);
}
typedef struct s_stack
{
struct s_stack *previous;
char *str;
} t_stack;
void ft_put_in(t_stack **stack,char *str)
{
t_stack *new;
new = (t_stack*)malloc(sizeof(t_stack));
new->str = ft_strdup(str);
new->previous = (*stack);
(*stack) = new;
}
char *ft_put_out(t_stack **stack)
{
char *out;
t_stack *temp;
out = ft_strdup((*stack)->str);
temp = (*stack)->previous;
free((*stack)->str);
free(*stack);
(*stack) = temp;
return (out);
}
int ft_isspace(char c)
{
return (c == ' ' || c == '\t' || c == 0 );
}
void ft_print_stack(t_stack *stack)
{
while (stack)
{
ft_putstr(ft_put_out(&stack));
if (stack)
ft_putchar(' ');
}
}
int main(int argc, char **argv)
{
int i;
t_stack *stack;
int len;
stack = NULL;
i = 0;
if (argc == 2)
{
len = ft_strlen_full(argv[1]);
while(i < len)
{
while (ft_isspace(argv[1][i]))
i++;
if (i >= len)
break;
ft_put_in(&stack,&(argv[1][i]));
i += ft_strlen(&argv[1][i]) + 1;
}
ft_print_stack(stack);
}
ft_putchar('\n');
}