Cześć
Wykonuję obecnie takie oto zadanie:
apisz i przetestuj funkcję łączącą N tekstów do wspólnego bufora o następującym wywołaniu:
concatenate(res, 20, 3, "Ala", "ma", "kota");
Funkcja ma przyjmować w parametrze:
bufor tekstowy,
rozmiar bufora (pojemność),
liczbę tekstów oraz
kolejne teksty.
Wyjściem mają być teksty oddzielone spacjami.
W przypadku sukcesu funkcja powinna zwrócić wartość 0,
w przypadku błędnych danych wejściowych wartość 1,
a w przypadku, kiedy pojemność bufora jest za mała funkcja powinna zwrócić wartość 2.
Napisz program, który pobierze od użytkownika liczbę tekstów do wczytania (od 2 do 4), a następnie wczyta te teksty i wykorzystując przygotowaną wcześniej funkcję połączy je w jeden tekst.
Przygotuj tablicę dwuwymiarową, alokowaną dynamicznie, na teksty pobierane od użytkownika oraz tablicę jednowymiarową do przechowania wyniku połączonych tekstów.
Tablica dwuwymiarowa powinna umożliwić przechowanie maksymalnie 4 tekstów o długości 1000 znaków każdy. Natomiast tablica jednowymiarowa powinna pozwolić na zapis tych tekstów w formie połączonej spacjami.
W przypadku niepowodzenia alokacji pamięci program powinien wyświetlić komunikat Failed to allocate memory i zakończyć działanie z kodem błędu 8.
W przypadku wprowadzenia błędnych znaków program powinien wyświetlić komunikat Incorrect input i zakończyć działanie z kodem błędu 1.
W przypadku błędnych danych wejściowych komunikat Incorrect input data i zakończyć działanie z kodem błędu 2.
Przyjmij założenie, że długość tekstów nie przekroczy 1000 znaków. Jeżeli podany tekst będzie dłuższy, to pozostałe znaki powinny zostać zignorowane.
Program powinien wyświetlić wynik połączenia podanych tekstów w jeden tekst (w jednej linii, bez dodatkowych znaków).
Przykładowa interakcja z programem -- sukces:
Podaj liczbe tekstow do wprowadzenia: 3⏎
Podaj teksty: "The man who has confidence in himself gains the confidence of others."- Hasidic Proverb⏎
Teaching is a very noble profession that shapes the character, caliber, and future of an individual. If the people remember me as a good teacher, that will be the biggest honour for me. - A. P. J. Abdul Kalam⏎
A woman is like a tea bag; you never know how strong it is until it's in hot water. - Eleanor Roosevelt⏎
"The man who has confidence in himself gains the confidence of others."- Hasidic Proverb Teaching is a very noble profession that shapes the character, caliber, and future of an individual. If the people remember me as a good teacher, that will be the biggest honour for me. - A. P. J. Abdul Kalam A woman is like a tea bag; you never know how strong it is until it's in hot water. - Eleanor Roosevelt
Przykładowa interakcja z programem -- brak pamięci:
Limit sterty: 6038
Failed to allocate memory⏎
Przykładowa interakcja z programem -- błąd danych wejściowych:
Podaj liczbe tekstow do wprowadzenia: 6⏎
Incorrect input data
Podaj liczbe tekstow do wprowadzenia: KYtdkxB⏎
Incorrect input
Uwaga
W programie nie wolno używać operatora [].
Na tą chwilę tak rozpisałem mój kod:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
int concatenate(char * buffer, int size_of_buffer,int elements,...);
int main()
{
printf("Podaj liczbe tekstow do wprowadzenia: ");
int choice;
if(scanf("%d",&choice)!=1)
{
printf("Incorrect input");
return 1;
}
if( choice < 2 || choice > 4 )
{
printf("Incorrect input data");
return 2;
}
int i = 0;
char ** pointer = (char **) malloc(sizeof(char *) * choice);
if( pointer == NULL )
{
printf("Failed to allocate memory");
return 8;
}
for( i = 0; i < choice; i++)
{
*(pointer + i) = (char *) malloc(sizeof(char) * 2500);
if( *(pointer + i) == NULL )
{
int get_out = 0;
for(get_out = 0; get_out < i;get_out++)
{
free(*(pointer + get_out));
}
free(pointer);
}
scanf(" %2500[^\n]",*(pointer + i) );
*(*(pointer + i) + 1000) = '\0';
}
return 0;
}
int concatenate(char * buffer, int size_of_buffer,int elements,...)
{
if( buffer == NULL || elements <= 0 || size_of_buffer <= 0 )
{
return 1;
}
va_list list;
va_start(list,elements);
int compare = 0;
char * point_on;
int i = 0;
for(i = 0; i < elements; i++)
{
point_on = va_arg(list,char *);
compare += strlen(point_on);
}
compare += (elements - 1) + 1; //na spacje i terminatora
va_end(list);
if( compare < buffer )
{
return 2;
}
return 0;
}
Zastanawiam się, czy to jak to rozpisałem (szczególnie w samej funkcji concatenate) jest na tą chwilę prawidłowe. Jeśli to jak teraz za pomocą zmiennej va_list mogę dokonać konkatenacji tychże tekstów? :)
P.S Pomysł na dokończenie funkcji concatenate mam mniej więcej taki:
int concatenate(char * buffer, int size_of_buffer,int elements,...)
{
if( buffer == NULL || elements <= 0 || size_of_buffer <= 0 )
{
return 1;
}
va_list list;
va_start(list,elements);
int compare = 0;
char * point_on;
int i = 0;
for(i = 0; i < elements; i++)
{
point_on = va_arg(list,char *);
compare += strlen(point_on);
}
compare += (elements - 1) + 1; //na spacje i terminatora
va_end(list);
if( compare < size_of_buffer )
{
return 2;
}
va_start(list,elements);
for(i = 0; i < elements; i++)
{
point_on = va_arg(list,char *);
if( i == 0 )
{
strcpy(buffer,point_on);
}
if( i != 0 )
{
strcat(buffer,point_on);
}
}
va_end(list);
return 0;
}