Notacja tablicowa i wskaźnikowa.

0

Witam. Na wstępie może powiem, że jestem świeżakiem jeśli chodzi o programowanie, więc zbyt skomplikowana nomenklatura może nie zostać przez mnie w pełni zrozumiana, ale do rzeczy. W ramach praktyki postanowiłem napisać sobie funkcję kopiującą C-string z tablicy do tablicy. Oto on:

 #include <iostream>
using namespace std;
char* strcpy(char *cel, const char *zrodlo);

int main() {
    const char *pierwsza = "hello 123 123";
    char druga[80];
    strcpy(druga, pierwsza);
    cout << pierwsza << endl;
    cout << druga << endl;
    return 0;
    }

char* strcpy(char *cel, const char *zrodlo) {
    char *poczatek;
    poczatek = cel;
    for(int i=0; zrodlo[i]!='\0'; i++) {
        cel[i] = zrodlo[i];
    }
    return poczatek;
}

W rezultacie po przekopiowaniu i wypisaniu drugiej tablicy dostaję "hello 123 123(...)", gdzie w miejscu wielokropka są jeszcze jakieś śmieci. Co dziwne (a przynajmniej dla mnie), po zmianie pierwszej linijki w mainie na:

 const char *pierwsza = "hello 123 123";

program działa jak najbardziej poprawnie i nie wyrzuca mi żadnych śmieci.
Teraz pytanie - czy wynika to z różnic pomiędzy notacjami (jeśli tak to z jakich), czy może coś robię źle w pozostałej części programu?
Z góry dziękuję za wszelką pomoc.

2

W rezultacie po przekopiowaniu i wypisaniu drugiej tablicy dostaję "hello 123 123(...)", gdzie w miejscu wielokropka są jeszcze jakieś śmieci.

Za ostatnim przekopiowanym znakiem należy wstawić znak końca łańcucha '\0'.

Poza tym

char *poczatek;
poczatek = cel; 

ten zabieg nie ma sensu.
Przekopiuj do cel i zwróć cel.

Nazywanie własnych funkcji ich oryginalnymi odpowiednikami jest złym pomysłem.

0

Dzięki za odpowiedź. Poprawiłem, może być tak?

 #include <iostream>
using namespace std;
char* kopiuj(char *cel, const char *zrodlo);

int main() {
    const char *pierwsza = "Hello 123 123 123";
    char *druga;
    kopiuj(druga, pierwsza);
    cout << pierwsza << endl;
    cout << druga << endl;
    return 0;
    }

char* kopiuj(char *cel, const char *zrodlo) {
    int i;
    for(i=0; zrodlo[i]!='\0'; i++) {
        cel[i] = zrodlo[i];
    }
    cel[i]='\0';
    return cel;
}

EDIT: Co do pierwszego posta - chodziło mi o zmianę z:

 const char *pierwsza = "hello 123 123";

na:

 const char pierwsza[] = "hello 123 123";
1

*Używaj angielskich nazw.
*Nie jest lepiej. Teraz to UB. Funkcja jest lepiej, ale w main?
druga to wskaźnik, więc wypadałoby ustawić jej adres na jakąś pamięć albo ją zaalokować.

edit:

Teraz pytanie - czy wynika to z różnic pomiędzy notacjami (jeśli tak to z jakich), czy może coś robię źle w pozostałej części programu?

Notacja nie ma znaczenia w tym przypadku.

0

Rzeczywiście, upośledziło mnie troszkę. Co teraz?

 
#include <iostream>
using namespace std;
char* copy_string(char *dest, const char *src);

int main() {
    const char *matrix_1 = "Hello 123 123 123";
    char *matrix_2 = new char[80];
    copy_string(matrix_2, matrix_1);
    cout << matrix_1 << endl;
    cout << matrix_2 << endl;
    delete [] matrix_2;
    return 0;
    }

char* copy_string(char *dest, const char *src) {
    int i;
    for(i=0; src[i]!='\0'; i++) {
        dest[i] = src[i];
    }
    dest[i]='\0';
    return dest;
}
1

W tym przypadku funkcja może nic nie zwracać, bo nic ze zwracanym wskaźnikiem nie robisz.

edit: jednak wg dokumentacji funkcja powinna zwracać wskaźnik dest, więc można to tak zostawić.

Dla poćwiczenia możesz zwracany wskaźnik przypisać od innego wskaźnika i na koniec zwolnić pamięć.

0

Jako, że funkcja zwraca wskaźnik do miejsca, do którego odbyło się kopiowanie, to może w ten sposób?

 #include <iostream>
using namespace std;
char* copy_string(char *dest, const char *src);
 
int main() {
    const char *matrix_1 = "Hello 123 123 123";
    char *matrix_2 = new char[80];
    cout << matrix_1 << endl;
    cout << copy_string(matrix_2, matrix_1) << endl; 
    delete [] matrix_2;
    return 0;
    }
 
char* copy_string(char *dest, const char *src) {
    int i;
    for(i=0; src[i]!='\0'; i++) {
        dest[i] = src[i];
    }
    dest[i]='\0';
    return dest;
}
0
    for(i=0; src[i]!='\0'; i++) {
        dest[i] = src[i];
    }
    dest[i]='\0';

albo

int i=0;
do
    dest[i] = src[i];
while (src[i++] != '\0');
0

a skoro do funkcji przekazujesz wskaźniki to może tak

char *tmp = dest;
do ; while ((*tmp++=*src++) != '\0');
return dest;

1 użytkowników online, w tym zalogowanych: 0, gości: 1