Η σελίδα μας αναβαθμίστηκε, γι' αυτό τον λόγο τα μέλη μας θα πρέπει να ζητήσουν νέο κωδικό πρόσβασης από την υπηρεσία "Αποστολή κωδικού πρόσβασης".
Εάν το email με τον νέο κωδικό δεν έρθει στο inbox κοιτάξτε και στο spam folder. Ο server είναι φρέσκος και δεν έχει το reputation που του αξίζει.

Ελεγχος αν λενα string είναι αριθμός

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
kostasevosm
Δημοσιεύσεις: 85
Εγγραφή: 01 Νοέμ 2006 12:16
Τοποθεσία: Salonica

Ελεγχος αν λενα string είναι αριθμός

Δημοσίευση από kostasevosm » 25 Σεπ 2008 16:30

Παιδιά βοήθεια
Θέλω να μάθω αν υπάρχει στην C++ συνάρτηση που να παίρνει είσοδο ένα string και να ελάγχει αν είναι ή όχι αριθμός.
μία πρώτη σκέψη είναι (ισχύει μόνο για ακέραιους) η παρακάτω αλλα εγώ θέλω και για float
int TForm1::IsNumber(AnsiString s)
{
int i,a;
for(i=1;i<=s.Length();i++)
{
if(!isdigit(s))
a=0;
else a=1;
}
return a;
}
σας παρακαλώ βοήθει καίγομαι

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Ελεγχος αν λενα string είναι αριθμός

Δημοσίευση από dva_dev » 25 Σεπ 2008 17:43

Πρίν αρχίσεις να κουράζεσαι άδικα (αφού χρησιμοποιείς c++ builder) ρίξε μια ματιά σε αυτά:
http://www.delphibasics.co.uk/RTL.asp?Name=StrToFloat
http://www.delphibasics.co.uk/RTL.asp?Name=Val

Άβαταρ μέλους
bxenos
Δημοσιεύσεις: 53
Εγγραφή: 18 Αύγ 2008 19:56

Ελεγχος αν λενα string είναι αριθμός

Δημοσίευση από bxenos » 26 Σεπ 2008 04:43

kostasevosm έγραψε:

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

    for&#40;i=1;i<=s.Length&#40;&#41;;i++&#41;
    &#123;
        if&#40;!isdigit&#40;s&#91;i&#93;&#41;&#41;
            a=0;
        else a=1;
    &#125;
    return a;
Δεν έχω δουλέψει ποτέ το AnsiString, αλλά ο κώδικας παραπάνω δεν μου μοιάζει να δουλεύει. Ελέγχει μόνο το τελευταίο χαρακτηρα αν είναι ψηφιο ή όχι. Και αν τύχει το string να αποτελείται απο εναν και μόνο χαρακτηρα επιστρέφει τυχαίο αποτέλεσμα.
(i=1 λαθος αρχικη τιμη) (i<=s.Length λαθος τελικη τιμη) (a=0 else a=1 χάνεις οτι τιμη ειχε ο a απο τις μεχρι τωρα συγκρισεις)

Μονο με formatter (νομίζω το FmtLoadStr είναι στην class αυτη) μπορεις να έχεις το κεφαλι σου ησυχο (φορμαρισμενη είσοδο), αλλιως πρεπει να ελένξεις οχι μονο τα τυπικα (αν εχει μια μονο υποδιαστολη) αλλα αν ειναι όλος ο αριθμος αναγνωσιμος (ή έχει πολλα δεκαδικά ή μη ψηφια και εχεις rounding).

Η λυση (χωρις formatter) ειναι να περνεις εναν χαρακτηρα τη φορα και να τον περνας μεσα σε ενα double (που εχεις περάσει ολους τους προηγουμενους). Θα πρεπει να ελέγχεις ολοι οι χαρακτηρες να ειναι ψηφια ή μεχρι μια υποδιαστολη ή ενα αρχικο προσημο ή το εκθετικο e.
Θα πρεπει να ελέγχεις αν ο αριθμος μετα την προσθηκη του τελευταιου ψηφιου ειναι μεγαλυτερος με τον προηγουμενο (πρις την εισαγωγη τελευταιου ψηφιου) εκτος αν το τελευταιο ψηφειο ειναι 0 και ειμαστε στα δεκαδικα.

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Ελεγχος αν λενα string είναι αριθμός

Δημοσίευση από soteres2002 » 26 Σεπ 2008 19:20

Μια εύκολη λύση για να checkareis και floats είναι να χρησιμοποιήσεις μια κανονική έκφραση, αλλιώς μπορείς να γράψεις κάτι πιο πολύπλοκο (στην πραγματικότητα κάτι σαν μικρό αναλυτή, δηλ έναν pattern matcher) που στην ουσία έχει το ίδιο αποτέλεσμα με την ΚΕ.

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Ελεγχος αν λενα string είναι αριθμός

Δημοσίευση από soteres2002 » 26 Σεπ 2008 20:24

Έγραψα ένα απλό Perl script πριν λίγο που αποδέχεται όλο το εύρος των αριθμών μέχρι πραγματικούς (IN, Z, IR), κάθετί άλλο απορρίπτεται. Δηλ. αποδέχεται απρόσημους ή προσημασμένους φυσικούς, ακέραιους, και πραγματικούς. Το PCRE regular expression, μπορεί να μεταφερθεί μέ ένα copy/paste σε C/C++ κώδικα.

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

#!/bin/env perl

while&#40;1&#41; &#123;
        print "Give me a string&#58; ";
        $str = <STDIN>;

        if&#40;$str =~ /^&#91;+-&#93;?&#40;&#91;0-9&#93;&#123;1,&#125;&#41;&#40;&#91;.,&#93;?&#40;&#91;0-9&#93;&#123;1,&#125;&#41;&#41;?$/&#41; &#123;
                print "is numeric!\n";
        &#125; else &#123;
                print "not numeric!\n";
        &#125;
&#125;
Δεν είμαι 100% σίγουρος όμως αν είνα απόλυτα σωστή από άποψη ασφάλειας, ίσως να υπάρχουν strings που μπορούν να προσπερνούν αυτό τον έλεγχο. Δοκίμασα διάφορα μοτίβα, μπορεί να τα τσέκαρα και όλα, και φαίνεται να δουλεύει καλά. Η PCRE αυτή υποτίθεται πως αποδέχεται συμβολοσειρές της μορφής <προεραιτικό πρόσημο><ακολουθία ψηφίων 0 ώς 9, τουλάχιστον ένα ψηφίο>(<προεραιτική υποδιαστολή ("." ή ",") και ακολουθία τουλάχιστον ενός ψηφίου από 0-9> (δηλ. όλους τους αριθμούς σε κανονική μορφή γραφής). Η έκφραση δεν δέχεται αριθμούς σε επισημονική γραφή, όπως επίσης δεν κάνει δεκτό δεκαδικούς της μορφής πχ .9 (δηλ 0.9).
Τελευταία επεξεργασία από το μέλος soteres2002 την 26 Σεπ 2008 21:13, έχει επεξεργασθεί 1 φορά συνολικά.

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Ελεγχος αν λενα string είναι αριθμός

Δημοσίευση από soteres2002 » 26 Σεπ 2008 20:55

bxenos έγραψε:Η λυση (χωρις formatter) ειναι να περνεις εναν χαρακτηρα τη φορα και να τον περνας μεσα σε ενα double (που εχεις περάσει ολους τους προηγουμενους). Θα πρεπει να ελέγχεις ολοι οι χαρακτηρες να ειναι ψηφια ή μεχρι μια υποδιαστολη ή ενα αρχικο προσημο ή το εκθετικο e.
Θα πρεπει να ελέγχεις αν ο αριθμος μετα την προσθηκη του τελευταιου ψηφιου ειναι μεγαλυτερος με τον προηγουμενο (πρις την εισαγωγη τελευταιου ψηφιου) εκτος αν το τελευταιο ψηφειο ειναι 0 και ειμαστε στα δεκαδικα.
Bxenos, αυτή η διαδικασία που περιγράφεις δεν επικυρώνει σωστά όλα τα στίνγκς. Πχ το "11." ή το ".11" λαμβάνεται υπόψην ώς αλφαριθμητικό (υπάρχει μια τουλάχιστον υποδιαστολή όπως λες), που στην πραγματικότητα δεν είναι αλφ/κό. Οπότε μετράει και η θέση που βρίσκονται οι υποδιαστολές. Με μια κανονική έκφραση νομίζω λύνεται το πρόβλημα πολύ απλούστερα παρά με 5 ή 10 if/else...

Άβαταρ μέλους
bxenos
Δημοσιεύσεις: 53
Εγγραφή: 18 Αύγ 2008 19:56

Ελεγχος αν λενα string είναι αριθμός

Δημοσίευση από bxenos » 27 Σεπ 2008 00:21

έχει η c++ regular expressions; το 12. είναι αποδεκτός αριθμός όπως και το .33
Μην αγχώνεσαι τόσο όμως, ο ενδιαφερόμενος δεν έχει εμφανιστεί για να πεί τι γνώμη του.

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Ελεγχος αν λενα string είναι αριθμός

Δημοσίευση από soteres2002 » 27 Σεπ 2008 00:53

bxenos έγραψε:έχει η c++ regular expressions;
Φυσικά και ναι. Υπάρχουν τόσο εξωτερικές βιβλιοθήκες για C/C++ πχ η PCRE (που είναι εγκατεστημένη σχεδόν σε κάθε unix σύστημα και υπάρχει για windows και άλλα OS). Κάθε λειτουργικό παρέχει native regular expression λειτουργίες (για C/C++). Καμία imperative γλώσσα δεν εχει (απο μόνη της) υποστήριξη για regular expressions, παρά μόνο υλοποίηση σαν shared library, όπως και στην PHP, Python κτλ. Εκτός από την Perl που φτιάχτηκε για pattern matching (οπότε και είναι embedded στον interpreter).
bxenos έγραψε: το 12. είναι αποδεκτός αριθμός όπως και το .33
Μην αγχώνεσαι τόσο όμως, ο ενδιαφερόμενος δεν έχει εμφανιστεί για να πεί τι γνώμη του.
Ναι ας πει αν χρειάζεται. Δεν αγχώθηκα. Επίσης, επειδή το σχολίασες το .33 και το 12. δεν είναι αριθμός μέχρι να το ορίσεις εσύ να είναι αριθμός - είναι μια ειδική σημειογραφία και δεν αναγνωρίζεται από όλους σαν αριθμός (εκτός από προγραμματιστές και μαθηματικούς ή άλλους που έτυχε να το ξέρουν). Επίσης, η ίδια σημειογραφία μπορεί να σημαίνει πολλά για διάφορα πράγματα. Επειδή δεν προσδιόρισε κάποιου είδους γραφή, θεώρησα αρχικά αυτονόητη την κανονική μορφή που ξέρουμε όλοι από την αριθμητική.

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης