bazinga13 Δημοσ. 21 Μαρτίου 2014 Δημοσ. 21 Μαρτίου 2014 Καλημερα σε ολους,η ερωτηση μου ειναι ποιος ειναι ο καλυτερος τροπος να διαβασουμε μια συμβολοσειρα? char ch[30]; scanf("%s",ch); input: my name is Iannis output : my Μολις βρει space σταματαει Αλλος τροπος ειναι η gets αλλα διαβασα το παρακατω κειμενο που σε αποτρεπει στο να την χρησιμοποιησεις So far, so good. Or so it seems... but really our problem has already begun. gets() has only received the name of the array (a pointer), it does not know how big the array is, and it is impossible to determine this from the pointer alone. When the user enters their text, gets() will read all available data into the array, this will be fine if the user is sensible and enters less than 99 bytes. However, if they enter more than 99, gets() will not stop writing at the end of the array. Instead, it continues writing past the end and into memory it doesn't own. προτεινουν την fgets,η ερωτηση μου ειναι η εξης char str[80]; int i; printf("Enter a string: "); fgets(str, 10, stdin); i = strlen(str)-1; if( str[ i ] == '\n') str[i] = '\0'; printf("This is your string: %s", str); ο αριθμος 10 αν καταλαβα καλα δινει το μεγεθος της συμβολοσειρας?το ετρεξα πολλες φορες και οταν εδινα τιμες πανω του 10 δεν τα εκτυπωνε στην οθονη οποτε υποθετω οτι ειναι αυτο,τοτε γιατι δινει αλλο μεγεθος οταν δηλωνει την συμβολοσειρα char str[80];και αλλη τιμη μεσα στην fgets?
Moderators Kercyn Δημοσ. 21 Μαρτίου 2014 Moderators Δημοσ. 21 Μαρτίου 2014 Το 10 δηλώνει το μέγιστο αριθμό χαρακτήρων που θα διαβάσει η fgets. Τώρα, γιατί δίνει μεγαλύτερο νούμερο στην str δεν ξέρω, αλλά ίσως έβαλε επιπλέον χώρο μήπως κάποιος θέλει ν' αλλάξει το 10 ή θέλει να κάνει κάποιες μετατροπές στο input και να το μεγαλώσει ή δεν ξέρω γω τι άλλο.
gon1332 Δημοσ. 21 Μαρτίου 2014 Δημοσ. 21 Μαρτίου 2014 Έτσι όπως χρησιμοποίησες την scanf σαν τη gets δουλεύει. Σωστός τρόπος χρήσης scanf είναι ο εξής: scanf("%10s", name); Πρέπει να θέτεις δηλαδή και το όριο του input. Όσον αφορά την fgets, o αριθμός δίνει το μέγιστο αριθμό χαρακτήρων που θα αντιγραφούν στο string, μαζί με το NULL. Να σου συστήσω το φίλο σου: http://www.cplusplus.com/reference/clibrary/ Για το παράδειγμα που έδωσες δεν υπάρχει κάτι το περίεργο. Απλά έβαλε μικρότερο αριθμό. Ένας μεγαλύτερος αριθμός θα μας πείραζε.
bazinga13 Δημοσ. 21 Μαρτίου 2014 Μέλος Δημοσ. 21 Μαρτίου 2014 Την καλησπερα μου και στους 2,φιλε gon1332 χαιρομαι που σε ξαναβλεπω ελπιζω να εισαι καλα,ξεσκονιζω την C μου που εχω κατι χρονια ν ασχοληθω και τα λιγα που ειχα μαθει τα εχω ξεχασει ,λοιπον οσον αφορα την fgets, ενταξει το καταλαβα αλλα τα υπολοιπα 2 δεν δουλευουν σ εμενα char ch[30]; scanf("%s",ch); printf("%s\n",ch); input: my name is Iannis output : my char ch[30]; scanf("%20s",ch); printf("%s\n",ch); input: my name is iannis output:my και στις 2 περιπτωσεις μολις βρουν το space σταματανε,δεν διαβαζουν παραπερα,το εψαξα στο ιντερνετ και οντος ειναι προβλημα,βρηκα απειρες σελιδες που το αναφερουν,οι περισσοτεροι σε αποτρεπουν να την χρησιμοποιησεις και προτεινουν την fgets People (and especially beginners) should never use scanf() or gets() or any of those functions that do not have buffer overflow protection. Just remember than scanf stands for "scan formatted" and there's precious little less formatted than user-entered data. It's ideal if you have total control of the input data format but generally unsuitable for user input. Use fgets() to get your input into a string and sscanf() to evaluate it. Since you just want what the user entered, you don't really need sscanf() in this case anyway: ενας αλλος παλι προτεινει την εξης λυση αλλα δεν ξερω μου φαινετε λιγο μπακαλιστικη,αλλα παρεπιπτοντως δουλευει χαχαχαχα, How to use scanf to read Strings with Spaces ?Its easy and simple, I don’t think I need to explain. Only the syntax needs to be remembered. scanf(” %[^\n]s”,a); May be you get a question in your mind. What does ‘[^\n]‘ do ? Does it set the delimiter to ‘\n’. Well, you on the right track. Yes, it does. Instead on ‘\n’, if you had put a ‘\t’ it would consider all words with spaces as string until you press a ‘Tab’. You can even have a ‘ ‘(a space). The scanf can be expanded as scanf(” %[^ ]s”,a); // Note – There is a space after ^ The only differece between scanf(” %s”,a) and scanf(” %[^ ]s”,a) is that, when you enter a string with two words, the former considers each word as a new string whereas the latter consider only the first word as a string and the other word is ignored. As a Example, consider the string “Hello World“, the former reads “Hello” and “World” as two strings (if you had called ‘scanf’ twice) and the latter reads only the first word “Hello” (even if you had called ‘scanf’ twice) ! Go ahead and experiment with other delimiters !! ετσι για να χουμε ν ασχολουμαστε διαβασα αρκετα και μπορω να πω οτι ηταν πολυ διασκεδαστικο,η εφευρετικοτητα των χρηστων της C και ο τροπος που λυνουνε τα κουλα που εχει η γλωσσα ειναι πραγματικα αξιοθαυμαστη,ο αλλος λεει "το εχω λυσει ειναι απλο" και παραθετει 15 γραμμες κωδικα,και να τα malloc,να τα διπλα pointers,να 15 ελεγχους με if σε καθε γραμμη για να τυπωσει στο τελος ενα Hello World χαχαχαχαχχαχα,αυτοι οι τυποι με σκοτωνουν
gon1332 Δημοσ. 22 Μαρτίου 2014 Δημοσ. 22 Μαρτίου 2014 και στις 2 περιπτωσεις μολις βρουν το space σταματανε,δεν διαβαζουν παραπερα,το εψαξα στο ιντερνετ και οντος ειναι προβλημα,βρηκα απειρες σελιδες που το αναφερουν,οι περισσοτεροι σε αποτρεπουν να την χρησιμοποιησεις και προτεινουν την fgets Σωστά. Δεν είναι κάποιο πρόβλημα που συμβαίνει μόνο σε σένα. Είναι ο τρόπος με τον οποίο δουλεύει η scanf(). Όπως είδες κι ο ίδιος υπάρχουν αρκετοί τρόποι να διαβάσεις μία πρόταση με whitespaces χρησιμοποιώντας τη scanf(). Ένας άλλος είναι με τη χρήση μιας επαναληπτικής δομής. Γενικά μπορείς να συναντήσεις πολλούς διαφορετικούς τρόπους. Ο πιο ασφαλής όμως είναι αυτός με την fgets. Αν τη συνηθίσεις από την αρχή (σε συνδυασμό με sscanf()) τότε ξεκινάς καλά. Αυτά τα περίεργα που είδες ([^\n]) είναι regular expressions (regex). Πρόκειται για μία άλλη φάρα. Είναι χρήσιμα γενικά, στον κώδικα όμως είναι δυσκολοχώνευτα. Ειδικά αν μετά από ένα χρόνο γυρίσεις να δεις τον κώδικα που είχες γράψει, θα φας σίγουρα την περισσότερή σου ώρα σε αυτά. Τέλος μιας και είπες ότι άρχισες να θυμάσαι C, πιστεύω θα σε βοηθούσε αυτό το κείμενο από Linus Torvalds για να γράφεις καθαρό κώδικα. Εμένα με βοήθησε αρκετά στο να καθαρίσω τον κώδικά μου. Βέβαια ο καθένας έχει το δικό του στυλ, αλλά κακό δεν κάνει.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα