Funkcja size_t length()

0

Witajcie!
Mam do napisania kilka funkcji w C++ operujących na napisach. Cały program powinien działać tylko i wyłącznie z plikiem nagłówkowym iostream.

#include <iostream>
using namespace std;

size_t length(const char* cstr);

int main(){
    char s1[] = "Przykladowe Zdanie";
    char s2[] = "Czesc";
    cout << "length : " << length(s1) << endl;
    cout << "length : " << length(s2) << endl;
    return 0;
}

size_t length(const char* cstr){
/*co tu trzeba napisac*/

}

Program powinien wypisać
length: 18
length: 5

Próbowałem już różnych sposobów, jednak najczęściej dostaję wymiar wskaźnika, albo jakieś bzdury...
Nawet próbowałem wpisać tam return (int)cstr; a następnie później bawić się z odejmowaniem, ale działało to jedynie dla pierwszego wywołania funkcji. Szukając w internecie, ciężko jest coś znaleźć na ten temat, bo wszędzie po prostu polecają użycie specjalnych plików nagłówkowych, a problem polega na tym, że ja nie mogę tego zrobić.

Czy ktoś jest w stanie mi to trochę wyjaśnić?

2
size_t length(const char* cstr){
	size_t result = 0, idx = 0;
	while(cstr[idx++]) ++result;
	return result;
}

http://ideone.com/7xwuEr

lub jak @twonek wspomniał

size_t length(const char* cstr){
	size_t idx = 0;
	while(cstr[idx++]);
	return idx-1;
}
0

Sam bym na to nie wpadł. Dzięki!

2

Można też ciut inaczej:

size_t length(const char* cstr)
{
	auto ptr = cstr;
	while(*ptr++);
	return ptr - cstr - 1;
}

http://melpon.org/wandbox/permlink/fsAm2TrVohJajsIc

0

Mam jeszcze jedno pytanie co do tego zadania, podepnę to pod ten temat.
Muszę napisać jeszcze jedną funkcję w tym samym programie:

char* reverse(char* cstr);

Wskazówka do funkcji:
reverse odwraca kolejność znaków w przekazanym napisie i zwraca niezmienioną wartość przekazanego wskaźnika cstr.
Napisałem funkcję:

char* reverse(char* cstr){
    int len = length(cstr);

    char swap;

    for (int i = 0; i < len/2; i++)
    {
        swap = cstr[i];
        cstr[i] = cstr[len-i-1];
        cstr[len-i-1] = swap;
    }

    return cstr;
}

Kiedy wywołam w main:

cout << reverse(s1) << endl;

Wyświetli mi się prawidłowo odwrócony napis, taki jak być powinien według treści. Jednak irytuje mnie fragment "zwraca niezmienioną wartość przekazanego wskaźnika cstr". Czy chodzi tu o to, że po wywołaniu funkcji w main, napis nie zostanie na stałe zmieniony? Jeśli wywołam w main:

```cpp
cout << reverse(s1) << endl;
cout << s1 << endl;
to druga linijka również wyświetli odwrócony napis.
0

Nie, chodzi o to, że wskaźnik będzie nadal pokazywał na początek stringa (teraz już odwróconego).

0

Czyli ten kod który napisałem, jest prawidłowy z treścią zadania?

0

Tak, wygląda ok.

0

Dzięki serdeczne!

0

Została mi ostatnia funkcja, do której polecenia nie mogę do końca zrozumieć.

char* concat(char* t, const char* s);

Wskazówka: concat "dokleja" do napisu t (od target) napis s (od source); oczywiście trzeba zadbać o to, aby zarezerwowany pod adresem t obszar pamięci wystarczał na pomieszczenie obu napisów wraz z kończącym znakiem '\0' ! Funkcja zwraca niezmodyfikowaną wartość pierwszego argumentu.

Czyli funkcja nie tworzy nowego napisu, który ma złączyć te dwa napisy, tylko musi tak jakby powiększyć t żeby zmieścił s i dokleić mu ten napis s? Ponadto funkcja ma zwrócić niezmodyfikowany pierwszy argument, czyli odwrotnie niż było w funkcji reverse? Jeśli jest ktoś zainteresowany tematem, kto mi trochę to objaśni to będę wdzięczny.

0

Dziwne zadanie. Albo możesz zadbać o to, aby bufor był odpowiednio duży, albo zwracasz ten sam wskaźnik. To się wzajemnie wyklucza.

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