stamatiou έγραψε:[snip]
Επίσης μήπως μπορεί να μου εξηγήσει κάποιος τον παρακάτω κώδικα:
- Κώδικας: Επιλογή όλων
int atoi(char s[])
{
int i,n;
n = 0;
for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i)
n = 10 * n + (s[i] - '0');
return n;
}
Δεν καταλαβαίνω τι κάνει το s[i] >= '0' && s[i] <= '9' και το n = 10 * n + (s[i] - '0')
[snip]
Εξετάζει μέσα σε ένα for-loop έναν-έναν τους χαρακτήρες του string s μέχρι να βρει κάποιον που ΔΕΝ είναι αριθμητικό ψηφίο. Στον πίνακα ASCII οι αριθμητικοί χαρακτήρες είναι συνεχόμενοι, από τον '0' έως και τον '9'.
Οπότε το for-loop σταματάει όταν βρει s[i] με ASCII code μικρότερο από το ASCII code του χαρακτήρα '0' ή μεγαλύτερο από το ASCII code του χαρακτήρα '9'.
Για όσους χαρακτήρες όμως ικανοποιούν τη συνθήκη του for-loop (είναι δηλαδή αριθμητικά ψηφία) τους περνάει έναν-έναν μέσα στο κυρίως σώμα της επανάληψης και τους πολλαπλασιάζει κάθε φορά με το 10 πριν τους προσθέσει στο εκάστοτε προηγούμενο άθροισμα.
Αυτό που κάνει η συνάρτηση είναι πως μετατρέπει ένα string s σε ακέραιο αριθμό int (ascii to int = atoi )
Π.χ. ας πούμε ότι το s αποτελείται από τα εξής ψηφία: 235 δηλαδή έχουμε ότι:
- Κώδικας: Επιλογή όλων
s[0] == '2'
s[1] == '3'
s[2] == '5'
Για να κάνει την πράξη που υπολογίζει το n μέσα στο κυρίως σώμα του for-loop, πρέπει το κάθε χαρακτήρα από αυτούς να τον αντιστοιχήσει πρώτα στην ακέραια τιμή που υποδηλώνει ο καθένας τους, η οποία ΔΙΑΦΕΡΕΙ από το ASCII code του.
Για παράδειγμα, το ASCII code του χαρακτήρα '2' δεν είναι το 2 αλλά το 50. Ομοίως το ASCII code του χαρακτήρα '3' δεν είναι το 3 αλλά το 51 (και του '5' είναι το 53).
Οπότε τι κάνει; Για καθένα ψηφίο του s αφαιρεί από το ASCII code του το ASCII code του χαρακτήρα '0' (το οποίο είναι 48) με το...
- Κώδικας: Επιλογή όλων
s[i] - '0
Δηλαδή, όταν το s[i] είναι '2' η παραπάνω αφαίρεση ισούται με τον ακέραιο 2 ( 50-48 ), όταν το s[i] είναι '3' η αφαίρεση δίνει 3 ( 51-48 ) κι όταν το s[i] είναι '5' η αφαίρεση δίνει 5 ( 53-48 ).