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

Problem przy sprawdzaniu poprawności zadania

Object Storage Arubacloud
0 głosów
563 wizyt
pytanie zadane 9 kwietnia 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)
edycja 9 kwietnia 2020 przez Hubertius

Hej

Miałem wykonać takie oto zadanie:

Napisz własne odpowiedniki funkcji strcpy, strcat oraz strlen. Użyj modyfikatorów const w liście parametrów.

Prototypy funkcji mają wyglądać następująco:

char* my_strcpy(char* dest, const char* src);
src - wskaźnik na tablicę znaków, skąd ma zostać skopiowany tekst,
dest - wskaźnik na tablicę znaków, do której ma zostać skopiownay tekst.
Funkcja zwraca NULL, jeśli nie można wykonać operacji, w przeciwnym wypadku funkcja ma zwrócić wskaźnik dest.
char* my_strcat(char* dest, const char* src);
src - wskaźnik na tablicę znaków, skąd ma zostać skopiowany tekst,
dest - wskaźnik na tablicę znaków, do której ma zostać doklejony tekst.
Funkcja zwraca NULL, jeśli nie można wykonać operacji, w przeciwnym wypadku funkcja ma zwrócić wskaźnik dest.
int my_strlen(const char* str);
Funkcja zwraca długość tekstu str, lub -1 jeśli nie może wyznaczyć długości tekstu.
Napisz program, który pobierze od użytkownika dwa teksty (txt1 oraz txt2, nie więcej niż 1000 znaków każdy), a następnie w oddzielnych liniach wyświetli:

długość obu tekstów (najpierw pierwszy, potem drugi, oddzielone spacjami),
wynik zastosowania funkcji my_strcat, z parametrami txt2, txt1.
wynik zastosowania funkcji my_strcpy, z parametrami txt2, txt1,
Uwaga!

W programie nie wolno używać operatora [] oprócz deklaracji tablicy.
W programie nie wolno używać funkcji z bibliotek standardowych ctype, string oraz stdlib.
Pamiętaj o zarezerwowaniu odpowiedniej ilości miejsca, dla zmiennej do której będziesz kopiował teksty.
Nie korzystaj z funkcji z rodziny scanf, za wyjątkiem samej funkcji scanf.
Przykładowa interakcja z programem -- sukces:

Wprowadz napis pierwszy: To jest pierwszy tekst
Wprowadź napis drugi: A to drugi
22 10
A to drugiTo jest pierwszy tekst
To jest pierwszy tekst
Wprowadz napis pierwszy: Z ⏎
Wprowadź napis drugi: b ⏎
dlugosc:2 dlugosc:2⏎
b Z ⏎
Z ⏎

Wszystkie testy dla powyższych funkcji zostały wykonane poprawnie. Jednak problem wystąpił przy sprawdzeniu poprawności wykonania całego programu.

Dla przykładowych danych:

Podaj pierwszy tekst: There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle. - Albert Einstein⏎
Podaj drugi tekst: As a technology, the book is like a hammer. That is to say, it is perfect: a tool ideally suited to its task. Hammers can be tweaked and varied but will never go obsolete. Even when builders pound nails by the thousand with pneumatic nail guns, every household needs a hammer.-James Gleick⏎
Dlugosc napisu pierwszego: 147. Dlugosc napisu drugiego: 289.⏎
As a technology, the book is like a hammer. That is to say, it is perfect: a tool ideally suited to its task. Hammers can be tweaked and varied but will never go obsolete. Even when builders pound nails by the thousand with pneumatic nail guns, every household needs a hammer.-James Gleick⏎
There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle. - Albert Einstein⏎
⏎
There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle. - Albert Einstein⏎
Program zakończony; kod błędu=0 (Ok)

Test został przerwany; Liczba linii wyświetlanych przez program jest niewłaściwa; Oczekiwano 3 a program wygenerował 4.

pojawia mi się powyższy komunikat. Problem występuje więc chyba przy "doklejaniu" tekstu pierwszego do drugiego.

James Gleick⏎

Po James-ie Gleick-u nie jest nadpisywany znak terminatora. Co mogę zrobić? Wydawało mi się, że to problem ze zmienną i we funkcji:

int i = my_strlen(dest);

i muszę odjąć od niej wartość -1. Ale wtedy znowu wszystko sypie się na testach. Tak więc jak sądzicie, jak mogę rozwiązać powyższy problem?

Mój kod do zadania:

#include <stdio.h>

char* my_strcpy(char* dest, const char* src);
char* my_strcat(char* dest, const char* src);
int my_strlen(const char* str);
char * my_strcat2(char* dest, const char* src);

int main()
{
    char table1[1001];
    char table2[1001];
    char * pointer_on_table1=table1;
    char * pointer_on_table2=table2;
    printf("Podaj pierwszy tekst: ");
    fgets(table1,1001,stdin);
    fflush(stdin);
    printf("Podaj drugi tekst: ");
    fgets(table2,1001,stdin);
    fflush(stdin);
    printf("Dlugosc napisu pierwszego: %d. Dlugosc napisu drugiego: %d.\n",my_strlen(table1) - 1,my_strlen(table2) - 1);
    my_strcat2(pointer_on_table2,(const char*)pointer_on_table1);
    printf("%s",table2);
    my_strcpy(pointer_on_table2,pointer_on_table1);
    printf("%s",table2);
    return 0;
}

char* my_strcpy(char* dest, const char* src)
{
    if( dest == NULL || src == NULL)
    {
        return NULL;
    }
    int i = 0;
    while( *(src + i) != '\0' )
    {
        *(dest + i) = *(src + i);
        i++;
    }
    *(dest + i) = '\0';
    return dest;
}

char* my_strcat(char* dest, const char* src)
{
    if( dest == NULL || src == NULL )
    {
        return NULL;
    }
    int i = my_strlen(dest);
    int j = 0;
    while( *(src + j) != '\0' )
    {
        *(dest + i + j) = *(src+j);
        j++;
    }
    *(dest + i + j)='\0';
    return dest;
}

int my_strlen(const char* str)
{
    if( str == NULL )
    {
        return -1;
    }
    int i = 0;
    while( * (str + i) != '\0' )
    {
        i++;
    }
    return i;
}

char * my_strcat2(char* dest, const char* src)
{
    if( dest == NULL || src == NULL )
    {
        return NULL;
    }
    int i = my_strlen(dest) - 1;
    int j = 0;
    while( *(src + j) != '\0' )
    {
        *(dest + i + j) = *(src+j);
        j++;
    }
    *(dest + i + j)='\0';
    return dest;
}

 

1 odpowiedź

0 głosów
odpowiedź 10 kwietnia 2020 przez j23 Mędrzec (194,920 p.)

Co mogę zrobić?

fgets czyta razem ze znakiem końca linii, dlatego powinieneś go usunąć z bufora zanim zaczniesz łączyć ciągi znaków.

int i = my_strlen(table1) - 1;
table1[i] = '\0';

i = my_strlen(table2) - 1;
table2[i] = '\0';

 

printf("Dlugosc napisu pierwszego: %d. Dlugosc napisu drugiego: %d.\n",my_strlen(table1) - 1,my_strlen(table2) - 1);

Według przykładów powinno być:

printf("%d %d\n", my_strlen(table1), my_strlen(table2));

Podobne pytania

0 głosów
1 odpowiedź 226 wizyt
pytanie zadane 11 maja 2021 w C i C++ przez Pabllo26 Obywatel (1,280 p.)
0 głosów
2 odpowiedzi 508 wizyt
pytanie zadane 3 czerwca 2016 w C i C++ przez iai Nowicjusz (200 p.)
0 głosów
0 odpowiedzi 196 wizyt

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

61,959 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!

...