Witam. Mam do wykonania takie 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,
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
Mój kod wygląda następująco:
#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;
}
char* my_strcat(char* dest, const char* src){
if(dest==NULL||src==NULL){
return NULL;
}
char* ptr1=dest;
const char* ptr2=src;
while(*ptr1!='\0'){
ptr1++;
}
while(*ptr2!='\0'){
*ptr1=*ptr2;
ptr1++;
ptr2++;
}
*ptr1='\0';
return dest;
}
char* my_strcpy(char* dest, const char* src) {
if (dest == NULL || src == NULL) {
return NULL;
}
size_t src_size = strlen(src);
dest = (char*) realloc(dest,src_size + 1);
char* ptr = dest;
const char* ptr1 = src;
while (*ptr1 != '\0') {
*ptr = *ptr1;
ptr++;
ptr1++;
}
*ptr = '\0';
return dest;
}
int main() {
char txt1[1001], txt2[1001];
printf("Podaj pierwszy tekst: ");
scanf("%1000[^\n]", txt1);
getchar();
printf("Podaj drugi tekst: ");
scanf("%1000[^\n]", txt2);
printf("%d %d\n", my_strlen(txt1), my_strlen(txt2));
printf("%s", my_strcat(txt2, txt1));
my_strcpy(txt2, txt1);
printf("\n%s", txt2);
return 0;
}
Program działa prawidłowo, natomiast system dante nie chce przyjąć funkcji strcpy. Jeden z tesów wygląda następująco:
char text_copy[] = "\nalledaN aytaS - .etercsid regnol on s\'tI .ygolonhcet noitamrofni yb nevird s\'taht tnemele eguh a sah ,yrtsudni yreve ni noitcnuf yreve ,yrtsudni yreve hcum ytterp oS .dezitigid si ecnanif ni gnineppah s\'taht gnihtyrevE .dezitigid si gnitekram ni gnineppah s\'taht gnihtyreve :gnitekram ta kool uoY";
printf("#####START#####");
char *text_copy_2 = my_strcpy(text_copy, "You look at marketing: everything that\'s happening in m");
printf("#####END#####\n");
test_error(strcmp(text_copy, "You look at marketing: everything that\'s happening in m") == 0, "Funkcja niepoprawnie skopiowała tekst, powinno być '%s', a jest '%s'", "You look at marketing: everything that\'s happening in m", text_copy);
test_error(text_copy == text_copy_2, "Funkcja my_strcpy zwróciła niepoprawną wartość; powinna zwrócić wskaźnik na dest");
Domyślam się, że chodzi tu o błąd związany z pamięcią. W momencie w którym src jest dłuższe od dest. Prosiłabym o jakieś wskazówki, jestem początkująca i nie mam już pomysłu jak to rozwiązać. Byłabym bardzo wdzięczna.