Το προβλημα νομιζω εντοπιστηκε αλλα δεν λυθηκε.
Εχω ενα κειμενο και θελω να μετρησω τους χαρακτηρες ανα σειρα.Φτιαχνω τον κωδικα που κανει την ιδια δουλεια με τον δικο σας παραπανω.
καποιες προτασεις εχουν τον χαρακτηρα στιξης που βρισκεται αναμεσα στα αγγλικα γραμματα ---> I’m. Ε, αυτον τον χαρακτηρα τον μετραει για τρια. Αυτο εχει σαν αποτελεσμα σε καποιες σειρες να μου βγαζει σωστο πληθος χαρακτηρων(οταν δεν βρισκεται αυτος μεσα)
και σε αλλες(που βρισκεται) να τον διαβαζει σαν 3 χαρακτηρες και το πληθος της σειρας να βγαινει +2 απο οτι θα επρεπε.
βαζω ενα if για να τον ανιχνευει αλλα αυτος ο χαρακτηρας δεν ξερω ποιος ακριβως ειναι στο ελληνικο-αγγλικο πληκτρολογιο . Δοκιμασα μερικους αλλα πραμα.
Σημείωση: Το μήνυμα αυτό γράφτηκε 12 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
vassilis498
Διακεκριμένο μέλος
Σημείωση: Το μήνυμα αυτό γράφτηκε 12 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
As you know, I’m quite keen of comic books, especially the
ones about superheroes. I find the whole mythology
surrounding superheroes fascinating. Take my favorite
superhero; Superman, not a great comic book, not
particularly well-drawn, but the mythology; the mythology is
not only great, it’s unique. Now, the staple of the
superhero mythology is; there is the superhero and there is
the alter ego. Batman is actually Bruce Wayne, Spiderman is
actually Peter Parker; when that character wakes up in the
morning, he’s Peter Parker. He has to put on a costume to
become Spiderman and it is in that characteristic, Superman
stands alone.
και ο κωδικας για να μετραει το πληθος των χαρακτηρων ανα γραμμη ειναι :
#include<stdio.h>
#include<stdlib.h>
main(int argc,char *argv[])
{
FILE *file;
int k=0;
char ch;
file=fopen(argv[1],"r");
do{
ch=fgetc(file);
if(ferror(file)) exit(1);
if(ch!='\n')
{
printf("%c",ch);
k++;
}
if(ch=='\n')
{
printf("\n %d \n",k);
k=0;
}
}while(ch!=EOF);
fclose(file);
}
Πως τοποθετεις κωδικα εδω περα;
Σημείωση: Το μήνυμα αυτό γράφτηκε 12 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
vassilis498
Διακεκριμένο μέλος
Σημείωση: Το μήνυμα αυτό γράφτηκε 12 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
στο πληκτρολογιο που υπαρχει αυτος ο χαρακτηρας;
Σημείωση: Το μήνυμα αυτό γράφτηκε 12 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
vassilis498
Διακεκριμένο μέλος
edit: ελληνικου λέω εε κάτι εκτός του standard προτύπου για την ακρίβεια
ή και εκτός ASCII ξέρω γω unicode
Σημείωση: Το μήνυμα αυτό γράφτηκε 12 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
Αρχικα πηγα και εκανα copy/paste τον χαρακτηρα απο το κειμενο και εβαλα στην if το ch!='τον χαρακτηρα' . Κατα τη ΜΕΤΑΓΛΩΤΙΣΗ του κειμενου μου πετα ΠΡΟΕΙΔΟΠΟΙΗΣΗ multi-character character constant [-Wmultichar] .Τρεχω το προγραμμα και μετραει τον χαρακτηρα στιξης ως τρια και οχι ως εναν .Με λιγα λογια ουτε και με το παραπανω εγχειρημα καταφερα κατι .
Προσθετω μεσα στο κειμενο ελληνικο γραμμα και επισης προσθετω τη καταλληλη εξεραιση αυτου στην if αλλα γινεται το ιδιο.Δηλαδη το μετραει για δυο () και δεν τον εξερει απο την καταμετρηση μιας κι εχω βαλει τον περιορισμο στην if.
Πληκτρολογοντας στο google τι σκατα ειναι το multi character moy bgale oyte ligo oyte poly oti δεν "μπορεις" να του βαλεις ' ' γιατι δεν θεωρειται ενας χαρακτηρας για την C.
Σημείωση: Το μήνυμα αυτό γράφτηκε 12 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
Πληροφορικάριος
Δραστήριο μέλος
Σημείωση: Το μήνυμα αυτό γράφτηκε 12 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
Σημείωση: Το μήνυμα αυτό γράφτηκε 12 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
Πληροφορικάριος
Δραστήριο μέλος
Λογικά είναι UTF-8.Αν θες πες μου τι επιλογές έχει.
Σημείωση: Το μήνυμα αυτό γράφτηκε 12 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
Σημείωση: Το μήνυμα αυτό γράφτηκε 12 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
Πληροφορικάριος
Δραστήριο μέλος
Σε μένα πάντως αυτό:
#include<stdio.h>
int main(void)
{
FILE *fp=fopen("text.txt","r");
int count=0;
char ch;
while(!feof(fp))
{
ch=fgetc(fp);
if(ch=='\n'|| ch==EOF)
{
printf("%d\n",count);
count=0;
}
else if(ch!='\t' && ch!=' ')count++;
}
return 0;
}
Σημείωση: Το μήνυμα αυτό γράφτηκε 12 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
#include<stdio.h>
#include<stdlib.h>
main(int argc,char *argv[])
{
FILE *file;
int k=0;
int ch;
file=fopen(argv[1],"rb");
do{
ch=fgetc(file);
if(ferror(file)) exit(1);
if(ch!='\n')
{
printf("%c",ch);
k++;
}
if(ch=='\n')
{
printf("\n %d \n",k);
k=0;
}
}while(ch!=EOF);
fclose(file);
}
Αν εξαιρεσεις το γεγονος οτι εγω δεν ελεγχω το '\t' (δεν αλλαζει τιποτα) ολα τα αλλα ειναι ιδια.
προσπαθησε να τρεξεις με τον κωδικα σου αυτο το αρχειο και πες μου αν σου βγαζει σωστο αριθμο χαρακτηρων :
As you know, I’m quite keen of comic books, especially the
ones about superheroes. I find the whole mythology
surrounding superheroes fascinating. Take my favorite
superhero; Superman, not a great comic book, not
particularly well-drawn, but the mythology; the mythology is
not only great, it’s unique. Now, the staple of the
superhero mythology is; there is the superhero and there is
the alter ego. Batman is actually Bruce Wayne, Spiderman is
actually Peter Parker; when that character wakes up in the
morning, he’s Peter Parker. He has to put on a costume to
become Spiderman and it is in that characteristic, Superman
stands alone.
Σημείωση: Το μήνυμα αυτό γράφτηκε 12 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
Πληροφορικάριος
Δραστήριο μέλος
48
43
48
41
53
42
50
50
49
46
51
12
Γιατί ανοίγεις το αρχείο binary?
Επίσεις πιστευώ πως για να λειτουργήσει σωστά θα πρέπει το αρχείο να είναι ASCII οπου κάθε χαρακτήρας είναι 1 byte.
Σημείωση: Το μήνυμα αυτό γράφτηκε 12 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
Σημείωση: Το μήνυμα αυτό γράφτηκε 12 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
Μου επιτρέπετε να συμμετάσχω κι εγώ στην παραπάνω κουβεντούλα;
Όπως σωστά ειπώθηκε, το αρχείο εισόδου κατά πάσα πιθανότητα είναι κωδικοποιημένο σε UTF-8. Στο UTF-8 οι χαρακτήρες δεν αναπαριστώνται όλοι με τον ίδο αριθμό bytes. Ο κάθε χαρακτήρας μπορεί να αναπαριστάται από 1 μέχρι 4 bytes.
Αν το 1ο byte ξεκινάει με 110, τότε ο χαρακτήρας έχει 2 byte, αν ξεκινάει με 1110 έχει 3 byte και τέλος αν ξεκινάει με 11110 έχει 4 byte. Όταν ένα byte αρχίζει με 10, τότε πρόκειται για το 2ο, 3ο ή 4ο byte κάποιου χαρακτήρα.
Κάποια σημαντικά πλεονεκτήματα με την αναπαράσταση αυτή : 1) μεγάλος πλήθος (2^21) διαφορετικών χαρακτήρων που μπορούν να αναπαρασταθούν, 2) οι χαρακτήρες που στατιστικά εμφανίζονται συχνότερα έχουν κωδικοποιηθεί έτσι ώστε να έχουν μικρό αριθμό bytes , 3) δυνατότητα ανίχνευσης λαθών, πχ ένα byte που αρχίζει με 0 δε μπορεί να ακολουθείται από byte που αρχίζει με 10. 4) Συμβατότητα με την ASCII κωδικοποίηση. Ένα αρχείο κειμένου που έχει μόνο ASCII χαρακτήρες θα είναι ακριβώς το ίδιο και σε ASCII και σε UTF-8.
Στο UTF-8 ο χαρακτήρας ’ αναπαριστάται με 3 bytes, και συγκεκριμένα τα : 226 128 153
128 (dec) = 10000000 (bin)
153 (dec) = 10011001 (bin)
Παρατηρούμε ότι τα πρώτα bits κάθε αριθμού έρχονται σε συμφωνία με αυτά που ανέφερα πριν για το UTF-8.
Για επαλήθευση των παραπάνω, μπορείς να δοκιμάσεις τα εξής :
1) πρόσθεσε ένα αρχείο κειμένου τον χαρακτήρα ’ και σύγκρινε το μέγεθος του αρχείου πριν και μετά. Θα δεις ότι θα αλλάξει κατά 3 bytes.
2) Άλλαξε στον κώδικα το printf("%c",ch); με printf("%d ",ch); και το ch δήλωσέ ως unsigned. Θα δεις ότι στο σημείο όπου διαβάζει το ’ θα τυπώσει τους αριθμούς 226 128 153.
Και κάτι ακόμα που αξίζει να σημειώσουμε. Μπορεί η μέτρηση των χαρακτήρων να μη σου έδωσε το αποτέλεσμα που περίμενες, ωστόσο με την εντολή printf("%c",ch); το κείμενο τυπώνεται σωστά στην έξοδο, εφόσον το τερματικό όπου εκτελείται το πρόγραμμα είναι ρυθμισμένο (κατά πάσα πιθανότητα) κι αυτό σε UTF-8.
Δοκίμασε να τρέξεις τον κώδικα printf("%c%c%c",226,128,153); Το αποτέλεσμα θα είναι να εκτυπωθεί το ’
Αρχικα πηγα και εκανα copy/paste τον χαρακτηρα απο το κειμενο και εβαλα στην if το ch!='τον χαρακτηρα' . Κατα τη ΜΕΤΑΓΛΩΤΙΣΗ του κειμενου μου πετα ΠΡΟΕΙΔΟΠΟΙΗΣΗ multi-character character constant [-Wmultichar] .
Πληκτρολογοντας στο google τι σκατα ειναι το multi character moy bgale oyte ligo oyte poly oti δεν "μπορεις" να του βαλεις ' ' γιατι δεν θεωρειται ενας χαρακτηρας για την C.
Μη θυμώνεις με τη C γιατί δε φταίει!
char = 1 byte.
Μέσα σε '' μπορούμε να βάλουμε μόνο 1 byte!
Το αρχείο με τον πηγαίο κώδικα μάλλον είναι κι αυτό σε UTF-8, όπου και το ’ και οι ελληνικοί χαρακτήρες είναι πάνω από 1 byte.
Ας πάρουμε για παράδειγμα τον κώδικα
ch = 'α';
printf("%c",ch);
Αν γράψεις τον κώδικα αυτό σε Greek ISO-8859-7 όπου το α είναι 1 byte και μετά τον ίδιο ακριβώς κώδικα τον γράψεις σε UFT-8 όπου το α είναι 2 bytes, στην πραγματικότητα γράφεις διαφορετικό κώδικα! Ο compiler δε καταλαβαίνει τι βλέπεις εσύ στην οθόνη, καταλαβαίνει ακολουθίες από bytes.
Με Greek ISO-8859-7 είναι σα να λες ch = 225 (η αναπαράσταση του α σε Greek ISO-8859-7). Η μεταγλώτισση του κώδικα σ' αυτή τη περίπτωση θα γίνει κανονικά, χωρίς warnings!
Με UFT-8 είναι σα να λες ch = 206 177 (η αναπαράσταση του α σε UTF-8 ) το οποίο προφανώς δε μπορεί να εκτελεστεί και γι αυτό σου βγάζει warning ότι γίνεται truncation και στο ch αποθηκεύει μόνο το λιγότερο σημαντικό byte (177).
Ας δούμε και τι θα εκτυπωθεί με την printf("%c",ch);
Αν ο κώδικας ήταν σε Greek ISO-8859-7, τότε θα εκτυπωθεί το α μόνο αν το τερματικό είναι κι αυτό σε Greek ISO-8859-7. Αν είναι σε UTF-8 τότε δε θα τυπώσει τίποτα αφού το 225 (bin 11100001) δεν είναι από μόνο του έγκυρος UTF-8 χαρακτήρας. Αν το τερματικό χρησιμοποιεί οποιαδήποτε άλλη κωδικοποίηση στην οποία το 225 είναι κάποιος χαρακτήρας, θα εκτυπωθεί ο χαρακτήρας αυτός.
Αντίστοιχα αν ο κώδικας ήταν σε UFT-8, τότε ανάλογα με την κωδικοποίηση του τερματικού θα εκτυπωθεί ο χαρακτήρας που αντιστοιχεί στον αριθμό 177.
so... γενικό συμπέρασμα : τέτοια προγράμματα για να εκτελεστούν σωστά θα πρέπει να υπάρχει συμβατότητα στα encodings που χρησιμοποιούνται στα αρχεία εισόδου, στο terminal όπου τρέχει το πρόγραμμα και στον source code.
Πήγαινε Αρχείο-->Αποθήκευση ως και επέλεξε κωδικοποίηση ANSI.
Μάλλον αναφέρεσαι στο Windows-1252
Δεν εχει ASCII ,ασε που και να το ειχε και εγω να καταφερνα να μετρησω σωστα οταν θα την ελεγχε ο καθηγητης μπορει να εβαζε ενα οποιοδηποτε αρχειο μεσα και να μην ειχε τετοια κωδικοποιηση.
Μπορείς να γράψεις ξεκάθαρα στην αναφορά που θα παραδώσεις ή στα σχόλια του κώδικα ότι η μέτρηση των χαρακτήρων θα γίνει σωστά όταν στο αρχείο εισόδου χρησιμοποιείται κωδικοποίση στην οποία κάθε χαρακτήρας είναι 1 byte.
Θα μπορούσες να γράψεις και κώδικα που αναγνωρίζει τη UTF-8 κωδικοποίηση και καταλαβαίνει σε ποιο byte τελειώνει ο κάθε χαρακτήρας, αλλά αυτό ξεφεύγει πολύ από τις απαιτήσεις της άσκησης.
Δε ξέρω ποιο text editor χρησιμοποιείς, καλό πάντως θα ήταν να εγκαταστήσεις κάποιον όπου να μπορεις να πειραματιστείς με διάφορα encodings. Σε linux μπορείς να χρησιμοποιήσεις gedit ή kate, σε windows το notepad++.
Σημείωση: Το μήνυμα αυτό γράφτηκε 12 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
Αρχικα σε ευχαριστω για το χρονο σου.Επειτα θα σου πω οτι εχω πειραματιστει βαζοντας αλλον χαρακτηρα στη θεση του ή εξαιροντας τον τελειως απο το κειμενο και εχω δει τις παραπανω παρατηρησεις. Το θεμα το δικο μου ειναι οτι εκτος απο ζητημα γνωσης, να καταλαβω δηλαδη γιατι συμβαινει αυτο , ειναι και ζητημα επιλυσης της ασκησης διοοτι κατα την εξεταση της μπορει το κειμενο που θα εισαγει ο εξεταστης να εχει την ιδια κωδικοποιηση με αυτη του δικου μου αρχιου και ετσι το προγραμμα μου να βγαλει λαθος αποτελεσματα και να κανει λανθασμενη δουλεια.. Οπως και να εχει θα διαβασω το παραπανω κειμενο σου με την πρωτη ευκαιρια που θα βρω γιατι θελω να καταλαβω τι ακριβως συμβαινει και επειτα θα προσπαθησω να δοκιμασω κατι στο δικο μου τμημα κωδικα.
Και παλι ευχαριστω.
Σημειωση! Την κωδικοποιηση του κειμενου την πετυχες .Επισης χρησιμοποιω το Kate στα Linux.
Σημείωση: Το μήνυμα αυτό γράφτηκε 12 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
Σημείωση: Το μήνυμα αυτό γράφτηκε 12 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
Πληροφορικάριος
Δραστήριο μέλος
Σημείωση: Το μήνυμα αυτό γράφτηκε 12 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
Ευχαριστω
Σημείωση: Το μήνυμα αυτό γράφτηκε 12 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
Χρήστες Βρείτε παρόμοια
-
Τα παρακάτω 0 μέλη και 2 επισκέπτες διαβάζουν μαζί με εσάς αυτό το θέμα:Tα παρακάτω 9 μέλη διάβασαν αυτό το θέμα:
-
Φορτώνει...
-
Το forum μας χρησιμοποιεί cookies για να βελτιστοποιήσει την εμπειρία σας.
Συνεχίζοντας την περιήγησή σας, συναινείτε στη χρήση cookies στον περιηγητή σας.