Προς το περιεχόμενο

Διαγραφή τιμών σε πίνακα - C


johnykim

Προτεινόμενες αναρτήσεις

Δημοσ.
Μια απορία που έχω : Η "continue;" τι ακριβώς κάνει βρε παιδιά;

 

Η continue προκαλεί άμεσο άλμα στο επόμενο iteration της for και έτσι δεν εκτελούνται οι εντολές εντός του βρόχου που έπονται αυτής.

 

 

Αφού έχουμε δώσει ήδη όλες τις τιμές της συμβολοσειράς(που μπορεί να είναι και αριθμοί) ,μετά η "continue;"(αν υπάρχει αριθμός)τον διαγράφει; Πως δεν υπολογίζεται στο πλήθος ο κάθε αριθμός με την "continue;" ;

 

Με την χρήση της getchar, η συμβολοσειρά που εισάγει ο χρήστης δε διαβάζεται «μια κι έξω», αλλά χαρακτήρα-χαρακτήρα. Άρα, αν έτυχε η ροή εκτέλεσης να φτάσει στην continue, αυτό σημαίνει πως στο συγκεκριμένο iteration διαβάστηκε χαρακτήρας που είναι αριθμητικό ψηφίο. Με την εκτέλεση της continue, ο κώδικας δεν αφήνεται να προχωρήσει παρακάτω όπου κανονικά θα γινόταν και η αύξηση του i counter κι έτσι πρακτικά αγνοείς τυχόν αριθμούς στο input του χρήστη, αφήνοντας όμως και περιθώριο για maximum 9 χαρακτήρες (αφού δεν αυξάνεις τον counter που ελέγχει τον τερματισμό του for loop).

 

 

Μια αλλαγή που έκανα είναι "pinakas[10]='\0';" εκτός επανάληψης.Δεν είναι πιο βαρύς ο κώδικας να αντικαθιστά το " '\0'; " στην for κάθε φορά;

 

Πολύ σωστή παρατήρηση. Απλά η συγκεκριμένη εντολή μου ξέμεινε από μία άκυρη υλοποίηση στην οποία καλούσα την strcat, οπότε χρειαζόμουν εκεί NULL-terminated string. Αν η εντολή μπει μία φορά εκτός βρόχου, το αποτέλεσμα θα είναι σωστό, χωρίς περιττές εκτελέσεις της.

Δημοσ.
Η continue προκαλεί άμεσο άλμα στο επόμενο iteration της for και έτσι δεν εκτελούνται οι εντολές εντός του βρόχου που έπονται αυτής.

 

Με την χρήση της getchar, η συμβολοσειρά που εισάγει ο χρήστης δε διαβάζεται «μια κι έξω», αλλά χαρακτήρα-χαρακτήρα. Άρα, αν έτυχε η ροή εκτέλεσης να φτάσει στην continue, αυτό σημαίνει πως στο συγκεκριμένο iteration διαβάστηκε χαρακτήρας που είναι αριθμητικό ψηφίο. Με την εκτέλεση της continue, ο κώδικας δεν αφήνεται να προχωρήσει παρακάτω όπου κανονικά θα γινόταν και η αύξηση του i counter κι έτσι πρακτικά αγνοείς τυχόν αριθμούς στο input του χρήστη, αφήνοντας περιθώριο για maximum 9 χαρακτήρες (αφού δεν αυξάνεις τον counter που ελέγχει τον τερματισμό του for loop).

 

Ok parsifal, κατάλαβα :-)

 

Ευχαριστώ και πάλι παιδιά :-)

Δημοσ.

Το if με την continue ελέγχει αν ο τρέχων χαρακτήρας είναι αριθμός.

Σε αυτή την περίπτωση η continue απλώς τον παρακάμπτει και οδηγεί την εκτέλεση στον επόμενο.

 

Δεν έχεις καταλάβει πώς δουλεύει το προγραμματάκι του parsifal.

Εσύ έχεις στο μυαλό σου ότι αρχικά εισάγεται μια συμβολοσειρά και μετά κάνεις την "εκκαθάριση".

Aλλά το πρόγραμμα του parsifal δεν κάνει αυτό.

Αντίθετα, γεμίζει τον πίνακα array όπου αποθηκεύεται η συμβολοσειρά εν διαβάσει, την ώρα που την εισάγεις.

Η εισαγωγή γίνεται με το c = getchar() που βρίσκεται στις συνθήκες ελέγχου του for .

Εντός του βρόγχου αν ο χαρακτήρας ΔΕΝ είναι αριθμός απλώς δεν καταχωρείται στον πίνακα array (η continue...).

Αν ο χρήστης πατήσει enter, ο τρέχων χαρακτήρας θα είναι '\n'. Αυτό ελέγχεται στις συνθήκες ελέγχου του for και θα τεματίσει την εισαγωγή χαρακτήρων. Άρα θα είναι και ο τελευταίος χαρακτήρας.

Επειδή ένα string τύπου char* πρέπει να τερματίζει πάντα με null, μετά από κάθε εισαγωγή εισάγεται το '\0' ως επόμενος χαρακτήρας ώστε σε περίπτωση τερματισμού το string να τελειώνει με null όπως είναι το σωστό.

Δημοσ.

Ξέχασα να στο γράψω παραπάνω: Πρόσεξε λίγο τον array index εκεί που θα τερματίσεις με '\0' το string μετά το for loop. Το σωστό είναι:

>
pinakas[i] = '\0';

 

Όχι:

>
pinakas[10] = '\0';    /* Εδώ πας να γράψεις στο byte της μνήμης αμέσως μετά τον πίνακα, δηλαδή εκτός πίνακα! */

Δημοσ.

Δεν έχεις καταλάβει πώς δουλεύει το προγραμματάκι του parsifal.

Εσύ έχεις στο μυαλό σου ότι αρχικά εισάγεται μια συμβολοσειρά και μετά κάνεις την "εκκαθάριση".

Aλλά το πρόγραμμα του parsifal δεν κάνει αυτό.

Αντίθετα, γεμίζει τον πίνακα array όπου αποθηκεύεται η συμβολοσειρά εν διαβάσει, την ώρα που την εισάγεις.

Η εισαγωγή γίνεται με το c = getchar() που βρίσκεται στις συνθήκες ελέγχου του for .

Αν ο χρήστης πατήσει enter, ο τρέχων χαρακτήρας θα είναι '\n'. Αυτό ελέγχεται στις συνθήκες ελέγχου του for και θα τεματίσει την εισαγωγή χαρακτήρων. Άρα θα είναι και ο τελευταίος χαρακτήρας.

 

Μα αυτό το έχω καταλάβει.:-)

Όταν είπα έχουμε δώσει τις τιμές, εννοούσα πληκτρολογούμε τις τιμές.Η εισαγωγή στον πίνακα, γίνεται φυσικά μέσα στην for,δηλαδή όταν πατήσουμε τον enter.

 

Εντός του βρόγχου αν ο χαρακτήρας ΔΕΝ είναι αριθμός απλώς δεν καταχωρείται στον πίνακα array (η continue...).

 

Θα εννοείς όταν ο χαρακτήρας είναι αριθμός.

 

@parsifal, αυτό θα μπορούσε να είναι σωστό; :

>pinakas[9] = '\0';

Δημοσ.

@parsifal, αυτό θα μπορούσε να είναι σωστό; :

>pinakas[9] = '\0';

 

Αν κάποιος δώσει 4 χαρακτήρες τι θα γίνει ?

Δεν ξέρεις από πριν πόσους θα δώσει.

Δημοσ.
Αν κάποιος δώσει 4 χαρακτήρες τι θα γίνει ?

Δεν ξέρεις από πριν πόσους θα δώσει.

 

Ω, σωστό αυτό :-)

 

Αλλά και λιγότερους να δώσει, από το πλήθος που χωράει ο πίνακας, απλά θα έχει κάποια "κενά" ενδιάμεσα.Η τελευταία τιμή του πίνακα θα είναι '\0' και θα τερματίζει κανονικά.

 

Όπως και να έχει όμως, πιο σωστό μου φαίνεται να είναι ο αμέσως επόμενος.:-) Οπότε θα χρησιμοποιήσω pinakas='\0'; :D

Δημοσ.
Αλλά και λιγότερους να δώσει, από το πλήθος που χωράει ο πίνακας, απλά θα έχει κάποια "κενά" ενδιάμεσα.

 

Αν δεν έχεις αρχικοποιήσει ρητά όλες τις θέσεις του πίνακα, δεν υπάρχει περίπτωση να γνωρίζεις τί τιμές θα έχουν τα ενδιάμεσα bytes. Αν π.χ. ο χρήστης δώσει 4 χαρακτήρες όπως είπε ο imitheos, μπορεί και από κάποια απίστευτη συγκυρία της τύχης το byte στη θέση array[4] να έχει τιμή '\0' και όλα να είναι εντάξει! :lol: Εκεί θα βασιστείς; Ο τερματισμός του string πρέπει να γίνει ρητά στη θέση που πρέπει για να είναι σωστός ο κώδικας, δεν υπάρχει άλλη επιλογή.

Δημοσ.
Ω, σωστό αυτό :-)

 

Αλλά και λιγότερους να δώσει, από το πλήθος που χωράει ο πίνακας, απλά θα έχει κάποια "κενά" ενδιάμεσα.Η τελευταία τιμή του πίνακα θα είναι '\0' και θα τερματίζει κανονικά.

 

Όπως και να έχει όμως, πιο σωστό μου φαίνεται να είναι ο αμέσως επόμενος.:-) Οπότε θα χρησιμοποιήσω pinakas='\0'; :D

 

Ναι φυσικά θα τερματίσει. Θα περιέχει όμως σκουπίδια. πχ αν δώσεις "Hello"

και πας να το τυπώσεις θα τυπώσει "HelloGZH3". Ό,τι υπάρχει στη μνήμη.

Μπορείς αν θέλεις να μηδενίσεις από την αρχή όλους τους χαρακτήρες ώστε να

μην σε νοιάζει πόσους θα δώσει, αλλά είναι πιο χρονοβόρο από το να θέσεις

τιμή στο pinakas

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...