Δημοσιεύτηκε: 30 Αύγ 2011, 16:17
Star_Light έγραψε:migf1 sorry αλλα δεν εχω βαλει το n ακομη επειδη θελω περισσοτερο να μεινω σε αυτο το σημειο και να καταλαβω επακριβως πως δουλευει ο αλγοριθμος. Φυσικα με δεικτες. Αλλιως για μενα τουλαχιστον δεν εχει νοημα. Ο κωδικας ειναι ο εξης :Spoiler: show
Τα λάθη που έκανα ηταν τα εξής :
1. Ουσιαστικα σε προηγουμενο κωδικα αυξανα μονο τον ptr2 και οχι τον ptr1 συνεπως ο ptr2 μαλλον αντεγραφε στον ptr1 μονο το πρωτο στοιχειο.
2. Δεν εσωζα το αποτελεσμα σε εναν *save (μυριζομουν οτι υπαρχει προβλημα με την τιμη επιστροφης αλλα δεν ηξερα τι ακριβως να κανω ωστε να το διορθωσω)
Φυσικα υπάρχουν αρκετα ερωτηματα. Καταρχην με μπερδευει το *save = ptr1; ο *save ειναι ορισμενος σαν δεικτης κατι που σημαινει οτι περιμενει μια δεξια τιμη.... πως παιρνει αριστερη? δηλαδη την τιμη του ptr1 τον οποιο εχω βάλει να δείχνει στον s1 πινακα.
Kαι μετα γιατι επιστρεφουμε σκετο save? Το save δειχνει στην αρχικη διευθυνση της συμβολοσειρας η οποια ειναι σειριακα στην μνημη? Αλλα και παλι δεν θα επιστρεψει διεύθυνση? Πως εκτυπωνεται τελικα.......
Λοιπόν, καταρχήν άλλαξε το όνομα της συνάρτησης σε κάτι που να καταλαβαίνουμε τι κάνει
Κατόπιν τα ptr1 και ptr2 δεν χρειάζονται καθόλου, θα δουλέψεις απευθείας με τα s1 και s2, οπότε ο κώδικάς σου γίνεται αμέσως-αμέσως λιτός κι ευανάγνωστος...
- Κώδικας: Επιλογή όλων
char *s_copy( char *s1 , char *s2);
// ----------------------------------------------------------------------------------------------------
int main( void )
{
char s1[5] = "Kost";
char s2[5] = "Cost";
printf("%s", s_copy( s1, s2) );
return 0;
}
// -----------------------------------------------------------------------------------------------------
char *s_copy(char *s1 , char *s2)
{
char *save = s1;
while ( *s2 != '\0' )
{
*s1 = *s2;
s2++;
s1++;
}
return save;
}
Για τον δείκτη save τώρα, όταν δουλεύεις τα strings απευθείας ως δείκτες (που ξεκινάνε δείχνοντας στην αρχή τους) τότε όταν γράψεις π.χ. s1++ για να προχωρήσεις στον 2ο χαρακτήρα του s1 έχασες την επαφή σου με την αρχή του s1. Στο τέλος του while-loop τόσο ο s1 όσο και ο s2 έχουν προχωρήσει (λόγω των s1++ και s2++) άρα έχεις χάσει την επαφή σου με τις αρχές των strings σου. Για το s2 σε αυτή την συνάρτηση δεν μας ενδιαφέρει, αλλά το s1 θέλουμε να το επιστρέψει η συνάρτηση. Όμως ο δείκτης s1 μετά το loop έχει πάει στο τέλος του string, και συγκεκριμένα δείχνει στον μηδενικό χαρακτήρα του s1, οπότε το: return s1 θα σου επέστρεφε έναν δείκτη στο τέλος του s1.
Για αυτόν ακριβώς τον λόγο λοιπόν, πριν ξεκινήσουμε το while-loop ορίζουμε έναν τοπικό δείκτη (τον save εδώ) τον οποίον το βάζουμε να δείχνει στην αρχή του s1 (save = s1). Άρα λοιπόν έχουμε σωσμένη την αρχή του s1, οπότε όταν τελειώσει το while-loop κι ο δείκτης s1 έχει φτάσει στο τέλος του string, εμείς επιστρέφουμε τον save, που δείχνει στην αρχή του string
Σημείωσε πως όταν δουλεύεις με μετρητές αντί για δείκτες, δεν το έχεις αυτό το πρόβλημα, γιατί το s1[i] δεν μετακινεί τον δείκτη s1 στη θέση i, απλά αναφέρεται στην θέση i... ισοδυναμεί δηλαδή με: s1+i και όχι με s1 = s1 + i;
Μι' πιάν'ς