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

Łączenie ze sobą wyrażeń.

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
64 wizyt
pytanie zadane 20 stycznia w C i C++ przez Zuzan Nowicjusz (220 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 6 dni temu przez overcq Pasjonat (19,310 p.)
edycja 4 dni temu 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 6 dni temu przez Oscar Nałogowiec (27,850 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 6 dni temu przez Zuzan Nowicjusz (220 p.)
edycja 6 dni temu przez Zuzan
Dobrze spróbuje napisać ten program jeszcze z użyciem tych funkcji, dziękuję.
komentarz 6 dni temu przez Zuzan Nowicjusz (220 p.)

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

komentarz 6 dni temu przez Oscar Nałogowiec (27,850 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 159 wizyt
0 głosów
2 odpowiedzi 497 wizyt
+1 głos
1 odpowiedź 47 wizyt

90,298 zapytań

138,894 odpowiedzi

311,080 komentarzy

60,012 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...