Δημοσιεύτηκε: 20 Ιουν 2011, 20:47
Δεν είναι τόσο τραγικό πάντως, ούτε χρειάζεται να εμβαθύνεις σε pointers κλπ απλά για να διαβάσεις ένα string. Μπορείς να χρησιμοποιήσεις την συνάρτηση: s_get() ατόφια όπως σου τη δίνω στον κώδικά μου για να διαβάζεις όποιο string θέλεις.
Π.χ. ορίζεις έναν string π.χ. line ως πίνακα από 256 char:
Ξεκίνα το απλά, όπως το έκανες και με το scanf(), όπου θα διαβάζεις έναν αριθμό τη φορά (κι όχι πολλούς μαζί σε μια γραμμή). Μόλις τον διαβάσεις με την:
μπορείς να χρησιμοποιήσεις μια από τις στάνταρ συναρτήσεις: strtod() ή atof() (εναλλακτικά μπορείς να δεις τα man pages τους στο linux σου) για να το μετατρέψεις σε αριθμό.
Η atof() είναι πιο απλή από την strtod() από την άποψη πως δεν σου επιστρέφει πολλά πράγματα για να τσεκάρεις πιθανά σφάλματα μετατροπής, αλλά σε βάζει στο νόημα.
Δοκίμασε π.χ. να γράψεις κάτι σαν το παρακάτω:
Δοκίμασε να την μπερδέψεις κιόλας με διαφορετικά strings να δεις πως αντιδράει. Μετά, αφού μπεις στο νόημα, δοκίμασε το ίδιο με την strtod(), και για να την κρατήσεις απλή πέρνα της το 2ο όρισμα ως NULL:
Δεν είναι κάτι το τραγικό δηλαδή, αυτό θέλω να πω. Άλλωστε όπως σου είπα, αργά ή γρήγορα θα αναγκαστείς να διαβάζεις όλα τα input ως strings και να τα μετατρέπεις μετά σε ότι θέλεις.
Οι συναρτήσεις μετατροπής είναι όλες στην <stdlib.h>
Ότι δυσκολία συναντήσεις είμαστε πάντα πρόθυμοι να βοηθήσουμε, εγώ τουλάχιστον. Κάνε πρώτα όπως το είχες στην αρχή το πρόγραμμα να διαβάζει ένα αριθμό την φορά, αλλά ως string που θα το μετατρέπεις σε double (αρχικά με την atof() για να μπεις στο νόημα, και πιο μετά με την strtod()).
Mετά θα κουβεντιάσουμε παρέα εδώ πως μπορείς να κάνεις και πιο ωραία πράματα, πριν τον μετατρέψεις... όπως π.χ. να σβήνεις τυχόν κενά πριν και μετά τον αριθμό, ή αν η γραμμή αποτελείται από πολλά κομμάτια διαχωρισμένα με κενά, να διαβάζεις το καθένα ξεχωριστά σε διαφορετικές μεταβλητές, κλπ.
Στο νήμα με τους Υπολογισμούς μεταξύ Ημερομηνιών, έχω συμπεριλάβει στον κώδικα συναρτήσεις γενικής διαχείρισης strings, όπως η s_trim() που σβήνει κενά από την αρχή και το τέλος ή την s_tolower() που μετατρέπει ένα string σε πεζά γράμματα, κλπ.... τις οποίες μπορείς να τις χρησιμοποιήσεις ατόφιες σε οποιοδήποτε πρόγραμμα.
Αλλά ξεκίνα από απλές μετατροπές πρώτα και όπου κολλάς ρώτα να το κουβεντιάζουμε
Αυτά είναι πράγματα που θα χρειαστεί να τα μάθεις έτσι κι αλλιώς 
Π.χ. ορίζεις έναν string π.χ. line ως πίνακα από 256 char:
- Κώδικας: Επιλογή όλων
char line[255+1];
Ξεκίνα το απλά, όπως το έκανες και με το scanf(), όπου θα διαβάζεις έναν αριθμό τη φορά (κι όχι πολλούς μαζί σε μια γραμμή). Μόλις τον διαβάσεις με την:
- Κώδικας: Επιλογή όλων
s_get( line, 256 );
μπορείς να χρησιμοποιήσεις μια από τις στάνταρ συναρτήσεις: strtod() ή atof() (εναλλακτικά μπορείς να δεις τα man pages τους στο linux σου) για να το μετατρέψεις σε αριθμό.
Η atof() είναι πιο απλή από την strtod() από την άποψη πως δεν σου επιστρέφει πολλά πράγματα για να τσεκάρεις πιθανά σφάλματα μετατροπής, αλλά σε βάζει στο νόημα.
Δοκίμασε π.χ. να γράψεις κάτι σαν το παρακάτω:
- Κώδικας: Επιλογή όλων
double f;
f = atof("+2.568976");
printf("%g\n", f);
Δοκίμασε να την μπερδέψεις κιόλας με διαφορετικά strings να δεις πως αντιδράει. Μετά, αφού μπεις στο νόημα, δοκίμασε το ίδιο με την strtod(), και για να την κρατήσεις απλή πέρνα της το 2ο όρισμα ως NULL:
- Κώδικας: Επιλογή όλων
double f;
f = strod("+2.568976", NULL);
printf("%g\n", f);
Δεν είναι κάτι το τραγικό δηλαδή, αυτό θέλω να πω. Άλλωστε όπως σου είπα, αργά ή γρήγορα θα αναγκαστείς να διαβάζεις όλα τα input ως strings και να τα μετατρέπεις μετά σε ότι θέλεις.
Οι συναρτήσεις μετατροπής είναι όλες στην <stdlib.h>
Ότι δυσκολία συναντήσεις είμαστε πάντα πρόθυμοι να βοηθήσουμε, εγώ τουλάχιστον. Κάνε πρώτα όπως το είχες στην αρχή το πρόγραμμα να διαβάζει ένα αριθμό την φορά, αλλά ως string που θα το μετατρέπεις σε double (αρχικά με την atof() για να μπεις στο νόημα, και πιο μετά με την strtod()).
Mετά θα κουβεντιάσουμε παρέα εδώ πως μπορείς να κάνεις και πιο ωραία πράματα, πριν τον μετατρέψεις... όπως π.χ. να σβήνεις τυχόν κενά πριν και μετά τον αριθμό, ή αν η γραμμή αποτελείται από πολλά κομμάτια διαχωρισμένα με κενά, να διαβάζεις το καθένα ξεχωριστά σε διαφορετικές μεταβλητές, κλπ.
Στο νήμα με τους Υπολογισμούς μεταξύ Ημερομηνιών, έχω συμπεριλάβει στον κώδικα συναρτήσεις γενικής διαχείρισης strings, όπως η s_trim() που σβήνει κενά από την αρχή και το τέλος ή την s_tolower() που μετατρέπει ένα string σε πεζά γράμματα, κλπ.... τις οποίες μπορείς να τις χρησιμοποιήσεις ατόφιες σε οποιοδήποτε πρόγραμμα.
Αλλά ξεκίνα από απλές μετατροπές πρώτα και όπου κολλάς ρώτα να το κουβεντιάζουμε

