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

Μέτρημα χαρακτήρων C


Μετάβαση στην απάντηση Απαντήθηκε από marios28,

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

Δημοσ.
6 ώρες πριν, yannis27gr είπε

Δοκίμασα και με unsigned. Τζίφος.

Δοκίμασε κι αυτό που λέει ο @marios28 ... λειτουργεί τέλεια!!! 

Είναι το μόνο που δεν δοκίμασα. Το είχα ξεχάσει...  η γλώσσα C μπορεί να διαβάσει και χαρακτήρες σε μορφή int  😀

Δημοσ.

Δοκιμασα σε Tiny C compiler και δουλευει με unsigned char οπως και με int (που ειναι και το σωστο αφου ετσι δηλωνεται στο conio.h).

Δες παντως και τη δυνατοτητα χρησης της strchr.

Δημοσ.
16 ώρες πριν, marios28 είπε

δήλωσε αντί για char ch -> int ch;

μην αλλάξεις τίποτα άλλο από τον αρχικό σου κώδικα

Ωραίος, αυτό ήταν!

Τζάμπα έμπλεκα με τους αριθμούς ASCII. Κανονικά έπρεπε να γράψω τον κώδικα έτσι:

main()
{
    system("chcp 1253>nul");
    char ch;
    int gr=0,lat=0;
    
    do
    {
        ch=getch();
        if (ch>='A'&&ch<='Z'||ch>='a'&&ch<='z')
            lat++;
        if (ch>='Α'&&ch<='Ω'||ch>='α'&&ch<='ω')
            gr++;
        
    } while (ch!=27);
    
    printf("\nΠληκτρολογήθηκαν %d ελληνικοί χαρακτήρες!",gr);
    printf("\nΠληκτρολογήθηκαν %d λατινικοί χαρακτήρες!",lat);
}

ο οποίος είναι σαφώς πιο straightforward και δουλεύει μια χαρά.

Ευχαριστώ όλους για τις απαντήσεις παιδιά!

Δημοσ.
Στις 27/2/2023 στις 3:42 ΜΜ, yannis27gr είπε

Πώς το κάνω αυτό; Σύμφωνα με τον ASCII πίνακα που συμβουλεύομαι, τα ελληνικά ξεκινούν από την 128η θέση.970948492_.jpg.0bb130f6b7f6117afeee8cb02c98d3d2.jpg

Σε αυτό που θέλεις να κάνεις μπλέκουν πολλά πράγματα για αυτό μπερδεύεσαι. Ένα είναι ο terrminal driver (ή όπως λέγεται στα windows) ο οποίος ρυθμίζεται να "στέλνει" κάποιο κώδικα για κάθε πλήκτρο που πατάς. Μετά έχεις την κωδικοσελίδα και ένα κάρο άλλα πράγματα.

Εσύ όταν πατάς ένα "Ελληνικό" πλήκτρο, στέλνονται 1 κωδικος για κάθε πλήκτρο σύμφωνα με το πρότυπο windows-1253. Για να λειτουργήσει λοιπόν το πρόγραμμά σου θα έπρεπε να ελέγχεις αυτούς τους κωδικούς. Επίσης μπορεί να οριστεί ώστε να στέλνει 2 κωδικούς για κάθε ελληνικό πλήκτρο που γράφεις (πχ σε μια παραλλαγή του UTF-16 στα windows) οπότε εκεί δεν θα έπαιζε με τίποτα το πρόγραμμα αυτό.

Αυτό που βλέπεις στην φωτογραφία σου να αναφέρεται καταχρηστικά ως ASCII μάλλον αποτυπώνει την κωδικοσελίδα DOS737 όπως σου ανέφεραν και άλλα παιδιά (και υπήρχε και η 869 και ένα κάρο άλλες ελληνικές με συνέπεια όταν έπαιρνες μια δισκέτα με ένα αρχείο να πρέπει να κάνεις ένα κάρο κόλπα για να το διαβάσεις).

Το "ASCII" όριζε μόνο μέχρι το 127, το οποίο εκμεταλλεύτηκαν οι συγγραφείς όλων των κωδικοσελίδων ώστε να προσθέσουν από εκεί και πέρα το εκάστοτε τοπικό αλφάβητο.

 

Στις 27/2/2023 στις 5:10 ΜΜ, yannis27gr είπε

Πράγματι, στη θέση 193 ξεκινούν τα ελληνικά. Γιατί συμβαίνει αυτό; Είναι θέμα υπολογιστή; Αν πάω σε άλλο πισι και εκτυπώσω τον ascii table θα βρω σε άλλη θέση τους ελληνικούς χαρακτήρες;

Παρεμπιπτόντως, παρόλο που βάζω τα σωστά νούμερα, επιμένει να μου βγάζει 0 στον αριθμό των ελληνικών χαρακτήρων (ενώ δουλεύει μια χαρά στους λατινικούς). Μάλιστα, για δοκιμή, στο 2ο if εβαλα να μετράει κάθε χαρακτήρα από 128-256, και πάλι τζίφος όμως. Μόλις γυρνάω το πληκτρολόγιο στα ελληνικά, παύει να διαβάζει και μένει κολλημένο στο 0.

Γενικά πολλά μπορεί να παίζουν αλλά αν μιλάμε για ένα σύστημα windows με ελληνική έκδοση εγκατεστημένη, τότε θα παίζει το ίδιο με το δικό σου.

Στις 28/2/2023 στις 6:54 ΠΜ, yannis27gr είπε

Ευχαριστώ για την απάντηση. Δοκίμασα να αντικαταστήσω το 1253 με το 737 (δηλαδή: system("chcp 737>nul"); αντί για system("chcp 1253>nul");) και επιμένει να βγάζει 0 στον αριθμό των ελληνικών, επιπλέον έγιναν τα πράγματα χειρότερα καθώς εκτύπωνε ακαταλαβίστικους χαρακτήρες αντί για ελληνικά.

image.png.929e3bcd425c3e490274d215fcc16935.png

 

Έγιναν ακαλαβίστικα για τον λόγο που περιέγραψα πριν. Είπες στο σύστημα να χρησιμοποιεί την κωδικοσελίδα 737 για να εμφανίσει την έξοδο αλλά η είσοδος που έδωσες δεν άλλαξε και έτσι ήταν windows-1253.

8 ώρες πριν, yannis27gr είπε

Ωραίος, αυτό ήταν!

Τζάμπα έμπλεκα με τους αριθμούς ASCII. Κανονικά έπρεπε να γράψω τον κώδικα έτσι:

        ch=getch();
        if (ch>='Α'&&ch<='Ω'||ch>='α'&&ch<='ω')
            gr++;
        
 οποίος είναι σαφώς πιο straightforward και δουλεύει μια χαρά.

Ευχαριστώ όλους για τις απαντήσεις παιδιά!

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

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...