Δημοσιεύτηκε: 12 Αύγ 2011, 14:09
από migf1
stamatiou έγραψε:Εκει που γράφει ++i και το ίδιο για τον pointer αφού προσθέτει πριν το ελέγξει το while πώς ελέγχεται το πρώτο char;

Αμάν, έχεις απόλυτο δίκιο... λαλακία μου! Εδώ ο σωστός κώδικας...

Spoiler: show
Κώδικας: Επιλογή όλων

#include <stdio.h>
#include <stdlib.h>

// ---------------------------------------------------------------------------------
// διαχείριση αποκλειστικά με δείκτες
//
size_t mystrlen1( const char *s )
{
if ( !s )
return -1;

const char *cp = s;
while ( *cp++ )
;
return --cp-s;
}
// ---------------------------------------------------------------------------------
// διαχείριση με μετρητή
//
size_t mystrlen2( const char s[] )
{
if ( !s )
return -1;

size_t i=0;
while ( s[i++] )
;
return --i;
}
// ---------------------------------------------------------------------------------
int main ( void )
{
char s[] = "123";

printf("mystrlen1(\"%s\") = %d\n", s, mystrlen1( s ) );
printf("mystrlen2(\"%s\") = %d\n", s, mystrlen2( s ) );

exit( EXIT_SUCCESS );
}
το διορθώνω και στο προηγούμενο πόστ! Thanks!

έγραψε:Επίσης στο πρώτο τι κάνει ακριβώς εκείνο το return;

Ο *cp είναι ένας δείκτης σε char που τον βάζω αρχικά να δείχνει στην αρχή του s (το: cp = s ισοδυναμεί με: cp = &s[0], απλά ορίζω κι αρχικοποιώ με μια κίνηση: char *cp=s και μετά μέσα στο loop τον προχωράω από χαρακτήρα σε χαρακτήρα μέχρι να βρει τον '\0'.

To '\0' ουσιαστικά είναι μια πιο αναγνώσιμη ονομασία για το 0 και πιο συγκεκριμένα για το: (char)0

Στη C οτιδήποτε ισούται με 0 είναι FALSE κι οτιδήποτε δεν ισούται με 0 είναι TRUE, οπότε αντί να γράφουμε:

Κώδικας: Επιλογή όλων
while ( *cp != '\0')
cp++;

μπορούμε να γράφουμε:

Κώδικας: Επιλογή όλων
while ( *cp )
cp++;

που με λόγια σημαίνει: όσο το περιεχόμενο του cp είναι TRUE (δεν είναι δηλαδή 0, δεν είναι μηδενικός χαρακτήρας) προχώρα τον cp μια θέση προς τα δεξιά.

Και τέλος μπορούμε να βάλουμε και την αύξηση μέσα στη συνθήκη του while και να αφήσουμε κενό το σώμα του:

Κώδικας: Επιλογή όλων

while ( *cp++)
;

Όταν τελειώσει το while ο cp θα δείχνει στη μνήμη του τελευταίου χαρακτήρα του s, που είναι ο μηδενικός χαρακτήρας. Αφαιρώντας αυτή τη μνήμη από τη μνήμη στην οποία ξεκινάει το s παίρνουμε ουσιαστικά το μήκος του string: cp-s. Επειδή όμως δεν θέλουμε να μετρήσουμε τον μηδενικό χαρακτήρα, στον διορθωμένο κώδικα φέρνω πρώτα τον cp μια θέση πίσω: --cp; και μετά κάνω την αφαίρεση, αλλά το κάνω πάλι σε μια κίνηση : --cp-s; και στην ίδια αυτή κίνηση βάζω και την επιστροφή της συνάρτησης:

Κώδικας: Επιλογή όλων
return --cp-s;