Witam. Mam do napisania taki program:
Napisz funkcję, która połączy 3 oddzielne napisy (np: "ala", "ma", "kota") tak, że w zmiennej wynikowej znajdzie się napis: "ala ma kota".
Prototyp funkcji powinien wyglądać następująco:
int connect(const char* t1, const char* t2, const char* t3, char* t4, int size);
Parametry:
- t1, t2, t3 - wskaźniki na tablice znaków, które mają zostać połączone,
- t4 - wskaźnik na tablicę, do której ma zostać zapisany wynik łączenia napisów,
- size - zadeklarowany rozmiar tablicy t4.
Wartość zwracana:
- Funkcja zwraca 1 gdy nie może wykonać operacji lub
- 0 po pomyślnym połączeniu napisów.
Napisz program, który pobierze od użytkownika 3 zdania (nie więcej niż 1000 pierwszych znaków z każdego), a następnie wykorzystując przygotowaną wcześniej funkcję połączy je w jeden ciąg.
Program powinien wyświetlić na konsoli ciąg wynikowy.
Przykładow interakcja z programem -- sukces:
Podaj tekst:
Ala⏎
Podaj tekst:
ma⏎
Podaj tekst:
kota⏎
Ala ma kota
Uwagi
- Nie korzystaj z bibliotek ctype, stdlib oraz string oraz z funkcji w nich zawartych.
- Nie korzystaj z funkcji z rodziny scanf, za wyjątkiem samej funkcji scanf.
- W programie nie wolno używać operatora [].
- W programie nie wolno używać magicznych liczb.
- Tekst powinien zostać wyświetlony bez zbędnych białych znaków przed i po właściwym tekście (znak nowej linii to też biały znak).
Napisałam ten program natomiast system dante w testach wykrył jeden błąd. Domyślam się, że chodzi o niespełnienie warunku dotyczącego rozmiaru tablicy wyjściowej(Jeśli jest mniejszy od sumy znaków podanych tekstów to nie zwraca 1). Nie do końca wiem dlaczego się tak dzieje. Byłabym bardzo wdzięczna za pomoc.
Mój program:
#include <stdio.h>
int my_strlen(const char* str){
if(str==NULL){
return -1;
}
int len=0;
const char* ptr=str;
while(*ptr!='\0'){
len++;
ptr++;
}
return len;
}
int connect(const char* t1, const char* t2, const char* t3, char* t4, int size){
int len1= my_strlen(t1), len2 = my_strlen(t2), len3 = my_strlen(t3);
int s=(len1 + len2 + len3);
if(t1==NULL||t2==NULL||t3==NULL||t4==NULL||s>size){
return 1;
}
if(len1 == 0){
*t4=' ';
t4++;
}
else{
while(*t1!='\0'){
*t4=*t1;
t1++;
t4++;
}
*t4=' ';
t4++;
}
if(len2 == 0){
*t4=' ';
t4++;
}
else{
while(*t2!='\0'){
*t4=*t2;
t2++;
t4++;
}
*t4=' ';
t4++;
}
while(*t3!='\0'){
*t4=*t3;
t3++;
t4++;
}
*t4='\0';
return 0;
}
int main() {
char txt1[1001], txt2[1001], txt3[1001], txt4[3003];
char* ptr1=txt1, *ptr2=txt2, *ptr3=txt3;
char* ptr4=txt4;
printf("Podaj tekst: ");
scanf("%1000[^\n]", ptr1);
while((getchar()!='\n'&&getchar()!=EOF));
printf("Podaj drugi tekst: ");
scanf("%1000[^\n]", ptr2);
while((getchar()!='\n'&&getchar()!=EOF));
printf("Podaj trzeci tekst: ");
scanf("%1000[^\n]", ptr3);
while((getchar()!='\n'&&getchar()!=EOF));
if(connect(ptr1, ptr2, ptr3, ptr4, 3003)==0){
printf("%s", ptr4);
}
return 0;
}
Test:
char output[591];
printf("#####START#####");
int res = connect("\"A computer lets you make more mistakes faster than any invention in human history - with the possible exceptions of handguns and tequila.\" - Author Unknown", "There are lots of examples of routine, middle-skilled jobs that involve relatively structured tasks, and those are the jobs that are being eliminated the fastest. Those kinds of jobs are easier for our friends in the artificial intelligence community to design robots to handle them. They could be software robots; they could be physical robots. - Erik Brynjolfsson", "It does not do to dwell on dreams and forget to live. - J.K. Rowling", output, 591);
printf("#####END#####\n");
test_error(res == 1, "Funkcja zwróciła niepoprawną wartość; powinna zwrócić wartość 1, a zwróciła %d", res);