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

Συμβολοσειρες στην C


alexc

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

Καλησπερα και απο μενα..... Εξοικειωνομαι με τους πινακες στην C και τις συμβολοσειρες... Ομολογω ειναι ενα αρκετα μεγαλο κεφαλαιο και και εχει πολλα πραματα να προσεξεις....

Προσπαθησα λοιπον σε μια συμβολοσειρα να εκτυπωσω το καθενα στοιχειο ξεχωριστα με μια απλη επαναληψη...

>
for (i=0;i<80;i++) printf("%c\n",lexi1[i]);

Αυτο που πηρα ως απαντηση ηταν οντως το καθε γραμμα ξεχωριστα το θεμα ειναι οτι πηρα και κινεζικα συμβολα μετα.... Αποτι καταλαβα δηλαδη κατι παιζει με το \0..... Μπορει να μου εξηγησει καποιος και πως το λυνουμε αυτο???

Δεν εχω κανει δεικτες επισης...

Ευχαριστω!

 

Εκανα κατι διαφορετικο και μου δουλευε.....

>
for (i=0;i<80&&lexi1[i]!='\0';i++) printf("%c\n",lexi1[i]);

Αλλα γιατι??? :P

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Πάρε ένα βιβλίο. Αυτό που δεν έχεις στο μυαλό σου είναι το βασικότερο των βασικών, και από αυτά που γράφεις είναι φανερό ότι έπεται συνέχεια.

 

Δεν υπάρχει περίπτωση να μάθεις σωστά απλά και μόνο ρωτώντας όταν νομίζεις ότι χρειάζεται, θέλεις και κάποιο δομημένο βοήθημα.

 

Για το συγκεκριμένο που ρωτάς αυτό φαίνεται ΟΚ σαν εισαγωγή.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Βιβλιο υπαρχει απλα ξεκινησα μια ασκηση μην εχοντας ουσιαστικα δουλεψει πολυ.... Μονο τις βασικες αρχες γαι τις συμβολοσειρες εχω μαθει απο 1 διαλεξη ολο και ολο στο πανεπηστημιο...

Ευχαριστω παντως για την βοηθεια.. χρειαζομαι αρκετη εξοικιωση με τους δεικτες για αυτο ρωταω και καποιους πιο εμπειρους :)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλησπερα και απο μενα..... Εξοικειωνομαι με τους πινακες στην C και τις συμβολοσειρες... Ομολογω ειναι ενα αρκετα μεγαλο κεφαλαιο και και εχει πολλα πραματα να προσεξεις....

Προσπαθησα λοιπον σε μια συμβολοσειρα να εκτυπωσω το καθενα στοιχειο ξεχωριστα με μια απλη επαναληψη...

>
for (i=0;i<80;i++) printf("%c\n",lexi1[i]);

Αυτο που πηρα ως απαντηση ηταν οντως το καθε γραμμα ξεχωριστα το θεμα ειναι οτι πηρα και κινεζικα συμβολα μετα.... Αποτι καταλαβα δηλαδη κατι παιζει με το \0..... Μπορει να μου εξηγησει καποιος και πως το λυνουμε αυτο???

Δεν εχω κανει δεικτες επισης...

Ευχαριστω!

 

Εκανα κατι διαφορετικο και μου δουλευε.....

>
for (i=0;i<80&&lexi1[i]!='\0';i++) printf("%c\n",lexi1[i]);

Αλλα γιατι??? :P

 

Ο '\0' ειναι ένα flag που δειχνει το τέλος του string στην C. Τα strings (συμβολοσειρες) στην C ειναι ουσιαστικα πινακες χαρακτήρων που πρέπει να έχουν μεσα τους σαν τελευταιο χαρακτηρα τον '\0'. Διαφορετικα ΔΕΝ ειναι strings. Ειναι απλα πινακες χαρακτηρων. Μπορεις να χρησιμοποιησεις το %s μεσα στην printf ή την puts ωστε να εκτυπώσεις ενα string. Εκεινο που περνάει μεσα στην συνάρτηση printf ή puts σαν ορισμα ειναι ουσιαστικά ενας δεικτης στο 1ο στοιχειο του πίνακα χαρακτήρων τον οποιο χρησιμοποιεις σαν string ΑΝ έχεις μεριμνήσει για την τοποθετηση του '\0' ή null ή τον χρησιμοποιεις σαν πινακα απλο χαρακτηρων αν ΔΕΝ εχεις βάλει τον '\0' . Η printf γραφει τους χαρακτηρες του string εναν προς έναν μέχρι να πέσει πανω στον κενο (null) ο '\0' που επισημάνθηκε προηγουμενως. Ο χαρακτηρας αυτος δεν πρεπει να παραλειπεται επειδη δεν θα βρεθει το τελος του string. Η αναζητηση θα συνεχισει περα απο το τελος της συμβολοσειρας μεχρι τελικα να βρει εναν null καπου στην μνήμη.

 

Επειδη μεσα στην printf χρησιμοποιεις το %c εγω αν ηθελα να επεξεργαστω strings με αυτο τον τροπο θα έγραφα κατι σε :

 

>

#include<stdio.h>
#include<stdlib.h>
#define STR_LEN 80

int main(void)
{
int i;
char lexi1[sTR_LEN+1]={'\0'};

printf(" Give a string : ");
gets(lexi1);

for (i=0;i<STR_LEN+1;i++)
printf("%c",lexi1[i]);  

exit(0);
}

 

p.s Η συναρτηση gets δεν πρεπει να χρησιμοποιειται. Η τρεχουσα χρήση της ειναι προσωρινή.

 

p.s2 Θα μπορουσες να βγαλεις ολο το for εννοειται και να δωσεις μετα την gets απλα μια

 

> puts(lexi1) ή printf("%s" , lexi1); 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το καταλαβα σωστα σε ευχαριστω πολυ!.....

Μπορεις να μου πεις γιατι δεν προτεινεις την gets???

 

Γιατι δεν έχεις έλεγχο στο πλήθος χαρακτήρων που διαβάζεις (again: ρίξε μια ματιά στο λινκ της υπογραφής μου :P).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το καταλαβα σωστα σε ευχαριστω πολυ!.....

Μπορεις να μου πεις γιατι δεν προτεινεις την gets???

 

Η gets δεν αγνοεί τους white space characters που διαβάζει. ΑΝ δώσεις ENTER καταλαθος πριν πληκτρολογησεις το string θα τερματίσει εκει το προγραμμα . Αν αποφασίσεις να χρησιμοποιήσεις την scanf απο την άλλη αυτη θα σταματήσει οταν βρει καποιον white space ασχετα αν εχει τελειωσει ή οχι το string σου. Πχ

 

>

#include<stdio.h>
#include<stdlib.h>
#define STR_LEN 80

int main(void)
{
int i;
char lexi1[sTR_LEN+1]={'\0'};

printf(" Give a string : ");
scanf("%s" , lexi1);

/*for (i=0;i<STR_LEN+1;i++)
printf("%c",lexi1[i]);*/

puts(lexi1);

exit(0);
}

 

Επισης η gets δεν έχει τροπο να ανιχνευσει ποτε ο πινακας ειναι πλήρης. Μπορει λοιπον να αποθηκευσει χαρακτηρες περα απο τα ορια του προκαλώντας UB

 

http://en.wikipedia....efined_behavior

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 

 

Η gets δεν αγνοεί τους white space characters που διαβάζει. ΑΝ δώσεις ENTER καταλαθος πριν πληκτρολογησεις το string θα τερματίσει εκει το προγραμμα .

...

 

Αυτό γιατί είναι πρόβλημα;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αυτό γιατί είναι πρόβλημα;

 

Σοβαρο προβλημα δεν ειναι. Αλλα οπως ειπα αν θες να κατοχυρωσεις οτι το προγραμμα θα συνεχιζει να περιμενει εισοδο ακομη

και αν ο χρηστης εχει πατησει αρχικα το ENTER ειτε ηθελημενα ειτε καταλαθος δεν θα επιλεξεις σιγουρα την gets περα απο το βασικο θεμα που ανεφερες και εσυ πιο πανω καθως και εγω αλλα σαν 2ο. Φυσικα δεν ξερω αν τελικα προκυπτει οντως προβλημα αν την gets την βαλεις μεσα σε ενα loop . Και να σου πω την αληθεια δεν ψηνομαι και να το ψαξω τωρα :P

 

Βλεπω 1-2 πραγματακια στις συναρτησεις αυτες.... και προτιμαω κάποια άλλη ειτε της libc είτε δικια μου.

 

p.s Αυτα ειναι υποκειμενικα καμια φορα migf1 εδω παλιοτερα θυμαμαι ειχες πει πως ενα for loop ειναι προτιμοτερο απο ενα while ή do while επειδη ολα τα expressions ειναι μαζεμενα σε μια γραμμη και πεφτει απευθειας το ματι σου... και το while 4-5 γραμμες να ειναι ομως.... so? :P

 

Ετσι και εδω αν δεν σε νοιαζει το ENTER εσενα στην αρχη δεν ειναι προβλημα οκ.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

 

Το ότι όμως διαβάζει και blanks και οτιδήποτε μέχρι να πατήσεις ENTER δεν είναι καθόλου πρόβλημα. Απεναντίας σε πολλές περιπτώσεις είναι και διευκόλυνση. Π.χ. όταν θέλεις να διαβάσεις τίτλους (βιβλίων, ταινιών, οτιδήποτε). Με scanf θέλεις πολλαπλάσια δουλειά.

 

Και φυσικά θα την έβάζες σε loop αν ήθελες να διαβάσεις πολλά μαζί.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Nαι σύμφωνοι. Δεν εχω διαβασει πουθενα οτι ειναι προβλημα .

 

Οποτε ας κρατησει οποιος θέλει οτι το ENTER στην αρχή της gets ειναι και η διαφορά (μια απο τις διαφορες) με την scanf... η τελευταια στην αρχη πριν πληκτρολογησεις το string τα κάνει skip τα white space (ΑΛΛΑ ΟΧΙ Και μετα).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

...

p.s Αυτα ειναι υποκειμενικα καμια φορα migf1 εδω παλιοτερα θυμαμαι ειχες πει πως ενα for loop ειναι προτιμοτερο απο ενα while ή do while επειδη ολα τα exp<b></b>ressions ειναι μαζεμενα σε μια γραμμη και πεφτει απευθειας το ματι σου... και το while 4-5 γραμμες να ειναι ομως.... so? :P

...

 

Τώρα το είδα αυτό.

 

Εξακολουθώ να υποστηριζω πως στη γενική περίπτωση το for-loop σε προφυλάσσει από πιθανά pitfalls, συγκρινόμενο με το while-loop, επειδή οπτικά είναι πολύ πιο εύκολο να εντοπίσεις πως έχεις ξεχάσει να κάνεις increase/decrease τον iterator. Τα loops δεν είναι πάντα 4-5 γραμμές, ούτε έχουν πάντα τετριμμένο σώμα.

 

Ακόμα και όταν θέλεις συνειδητά να πειράζεις τον iterator conditionally, με for-loop είναι οπτικά πολύ πιο εύκολο να καταλάβεις πως στο συγκεκριμένο loop χρησιμοποιείς επίτηδες conditional iterator mofidification, επειδή πολύ απλά ο iterator λείπει από την "φυσική" του θέση, στο τέλος της παρένθεσης του for-loop.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

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

Σύνδεση

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

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