• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Łączenie ze sobą wyrażeń.

Object Storage Arubacloud
0 głosów
253 wizyt
pytanie zadane 20 stycznia 2023 w C i C++ przez Zuzan Początkujący (390 p.)

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);

 

komentarz 20 stycznia 2023 przez overcq Pasjonat (21,650 p.)
edycja 22 stycznia 2023 przez overcq

Wydaje się, że sposób obliczania s jest błędny: nie uwzględniasz rozdzielających spacji oraz znaku końca tekstu (\0).

Poza tym funkcje obliczające długość ciągów nie wydają się konieczne: wystarczy podczas kopiowania przerwać, jeśli długość miałaby przekraczać podany rozmiar.

komentarz 20 stycznia 2023 przez Oscar Nałogowiec (29,290 p.)

O ile dobrze kojarze, masz napisane swoje wersje strcpy, strcat - szczególnie ta druga to dobry poczatek:
 

t4[0] = 0;  // pusty wynik
strcat(t4, t1);
strcat(t4, " ");
strcat(t4, t2);
strcat(t4, " ");
strcat(t4, t3);


Trzeba tylko dopisać sprawdzanie dopuszczalnej wielkości. Najlepiej od razu do my_strcat. Taka funkcja w bibliotece nazywa się strncat. Oczywiście dopisywane spacji
poprzez strcat to lekka perwersja, ale ujdzie.

komentarz 20 stycznia 2023 przez Zuzan Początkujący (390 p.)
edycja 20 stycznia 2023 przez Zuzan
Dobrze spróbuje napisać ten program jeszcze z użyciem tych funkcji, dziękuję.
komentarz 20 stycznia 2023 przez Zuzan Początkujący (390 p.)

@overcq, Tak rzeczywiście, uwzględniłam s bez znaków. Zmieniłam to i program zadziałał. Dziękuję

komentarz 21 stycznia 2023 przez Oscar Nałogowiec (29,290 p.)

@Zuzan, taka drobna uwaga:

Przykładowo zamiast pisać

    while(*t3!='\0'){
        *t4=*t3;
        t3++;
        t4++;
    }
 
    *t4='\0';

możesz napisać:

    while(*t4++ = *t3++);

Tak pisały w C starożytne Gumisie.

Oczywiście jak kompilator zoptymalizuje to na jedno wyjdzie, ale dla mnie tak jest czytelniej.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 258 wizyt
0 głosów
2 odpowiedzi 804 wizyt
+1 głos
1 odpowiedź 184 wizyt

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...