Star_Light Δημοσ. 15 Δεκεμβρίου 2012 Δημοσ. 15 Δεκεμβρίου 2012 Λογικά δεν έχει σχέση η getchar() αλλά το ότι χρησιμοποιεί strcpy() αντί για strncpy(). Καλησπέρα. Κοιτα δεν το έχω ψάξει πολυ με αυτο που λες αλλα το θεμα πιστευω ειναι οτι αυτα που παραμένουν στο buffer αν ο χρηστης δωσει μεγαλυτερη εισοδο ουσιαστικα πανε σαν εισοδος στην επομενη getchar(). Για παραδειγμα ο κωδικας > #include<stdio.h> #include <string.h> #define n 10 int read_line(char * , int ); int main(void) { char msg_str[n]={'\0'}; read_line(msg_str, n); puts(msg_str); read_line(msg_str, n); puts(msg_str); return 0; } int read_line(char str[] , int maxlen) { int ch , i =0 ; while( (ch= getchar()) !='\n' && i<maxlen) str[i++]= ch; str[i]='\0'; return i; } Κανει ακριβως αυτο το πραγμα.. αν του δωσεις εισοδο μεγαλυτερη απο n τοτε οτι απέμεινε παει για την επομενη κληση της getchar() . Πιστευω οτι ακριβως αυτο ειναι το θεμα χωρις να εχω δει την strcpy .
koslibpro Δημοσ. 19 Δεκεμβρίου 2012 Δημοσ. 19 Δεκεμβρίου 2012 (επεξεργασμένο) Καλησπερα, εχω εναν πινακα kati[9][3] που τα χ πρωτα στοιχεια του ειναι !=0 και τα υπολοιπα 0. με ποιον τροπο μπορω να βρω ποιο ειναι το πρωτο στην σειρα στοιχειο με 0 και να του αλλαξω την τιμη σε κατι διαφορο του 0? ευχαριστωυγ:παιδεψτε με λιγο,μην μου δωσετε κωδικα απευθειας update:μεσα σε διπλο for loop θα κανω if(kati[j] != 0) και αν ισχυει τοτε θα αλλαζω την τιμη σε αυτο που θελω. σωστος? Επεξ/σία 19 Δεκεμβρίου 2012 από koslibpro
Star_Light Δημοσ. 19 Δεκεμβρίου 2012 Δημοσ. 19 Δεκεμβρίου 2012 Διάβασα σε ένα ελληνικο βιβλιο οτι οιchar *message=".... ";char message[]="....";ειναι ισοδύναμες λεει.... Μα τι λέει? Απόσπασμα :------------------------------------------------Η αρχή μιας συμβολοσειράς , οπως αναφέρθηκε προηγουμένως , δηλώνεται απο έναν δείκτη σε μια μεταβλητή τύπου char. Μπορεί να θυμάστε πως δηλώνεται ένας τέτοιος δείκτης :char *message;Αυτή η πρόταση δηλώνει εναν δείκτη σε μια μεταβλητή τύπου char με το ονομα message . Δεν δείχνει σε τίποτε προς το παρόν , αλλα αν αλλάζατε τη δήλωση του δείκτη στην ακόλουθη:char *message="Hello";η συμβολοσειρά hello (με εναν κενο χαρακτηρα τερματισμού) αποθηκεύεται κάπου στην μνήμη , και ο δείκτης message παιρνει την αρχική τιμή της διεύθυνσης του πρώτου χαρακτήρα της.Μην ανησυχείτε για την θέση αποθήκευσης της συμβολοσειράς στην μνήμη. Την χειρίζεται αυτοματα ο μεταγλωτιστής. Μολις δηλωθεί , ο δεικτης message δειχνει στην συμβολοσειρα και μπορει να χρησιμοποιηθεί με αυτο τον τροπο.Η προηγούμενη δήλωση και αποδοση αρχικής τιμής ειναι ισοδύναμη με την ακόλουθη πρόταση -> char message[]="Hello"; , και οι 2 σημειογραφιες *message και message[] ειναι επισης ισοδύναμες. Και οι 2 σημαίνουν εναν δεικτη προς....--------------------------------------------------Ολα καλά αλλα δεν συμφωνω και πολυ με το οτι οι 2 δηλώσεις ειναι ισοδυναμες... οπως γραφει και ο King στην Σελ. 283 ..... Ηowever we must be careful to to make the mistake of thinking that the two versions of date are interchangeable .... δηλαδη δεν ειναι ισοδυναμες αυτες οι 2 με 2 λογια. Εκτος και αν μεταφραζω λαθος το interchangeable.
migf1 Δημοσ. 19 Δεκεμβρίου 2012 Δημοσ. 19 Δεκεμβρίου 2012 Μήπως είναι πολύ παλιό το βιβλίο; Έχω την εντύπωση πως σε K&R ήταν όντως ισοδύναμες (αλλά πάει και τόσος καιρός από τότε, ίσως να το θυμάμαι λάθος).
Star_Light Δημοσ. 19 Δεκεμβρίου 2012 Δημοσ. 19 Δεκεμβρίου 2012 Μήπως είναι πολύ παλιό το βιβλίο; Έχω την εντύπωση πως σε K&R ήταν όντως ισοδύναμες (αλλά πάει και τόσος καιρός από τότε, ίσως να το θυμάμαι λάθος). Nαι ειναι. 1997 αυτο απο το οποιο πηρα το αποσπασμα. ΑΛλα εχω και την δευτερη εκδοση των K&R που αναδιατυπωθηκε το 2005 . ΣΤην Σελ. 150 αυτου γραφει οσα και ο King περιπου.... αλλωστε και ο King εχει παρει καποια πραγματα σχεδον αυτουσια απο τα βιβλια των K&R. Φυσικα δεν γραφει πουθενα την μ****α οτι οι 2 δηλωσεις ειναι ισοδυναμες
migf1 Δημοσ. 20 Δεκεμβρίου 2012 Δημοσ. 20 Δεκεμβρίου 2012 Η 2η έκδοση του βιβλίου των K&R περιγράφει την ANSI C. Λέγοντας K&R C εννοούμε την προ ANSI εποχή, δηλαδή την 1η έκδοση του βιβλίου των K&R.
Star_Light Δημοσ. 20 Δεκεμβρίου 2012 Δημοσ. 20 Δεκεμβρίου 2012 Η 2η έκδοση του βιβλίου των K&R περιγράφει την ANSI C. Λέγοντας K&R C εννοούμε την προ ANSI εποχή, δηλαδή την 1η έκδοση του βιβλίου των K&R. Ναι καταλαβα οτι εννοουσες την 1η εκδοση εσυ. Για αυτο σου ειπα αλλωστε οτι το βιβλιο που εχω ειναι για την δευτερη
koslibpro Δημοσ. 20 Δεκεμβρίου 2012 Δημοσ. 20 Δεκεμβρίου 2012 σωστός. ωραια! τωρα αν θελω να κανω το ιδιο με την χρηση pointers,πως θα γινει? for(i=*table;i<=(*table*sizeof(tabletype));i++){} ετσι θα ειναι το for? κατι δεν μου αρεσει ομως..
migf1 Δημοσ. 20 Δεκεμβρίου 2012 Δημοσ. 20 Δεκεμβρίου 2012 ωραια! τωρα αν θελω να κανω το ιδιο με την χρηση pointers,πως θα γινει? for(i=*table;i<=(*table*sizeof(tabletype));i++){} ετσι θα ειναι το for? κατι δεν μου αρεσει ομως.. Πιστεύω δεν είναι καλή ιδέα να διατρέχεις με δείκτες πολυδιάστατους πίνακες, κυρίως διότι υπάρχουν περισσότεροι του ενός τρόποι, κανένας εκ των οποίων δεν εμπεδώνεται εύκολα αν δεν εισαι ήδη πολύ καλά εξοικειωμένος με τους δείκτες. Εξαρτάται επίσης και πως έχεις ορίσει τον 2Δ πίνακά σου (π.χ. είναι στατικά ορισμένος ή δυναμικά; Αν είναι δυναμικά, έχει ή κάθε του γραμμή ίδιο μήκος ή η κάθε γραμμή μπορεί να έχει διαφορετικό; Γενικώς, είναι λίγο... βαβουρίτσα Τι πρόβλημα έχεις με τους απλούς indexers i και j?
koslibpro Δημοσ. 20 Δεκεμβρίου 2012 Δημοσ. 20 Δεκεμβρίου 2012 ωραια!τωρα αν θελω να κανω το ιδιο με την χρηση pointers,πως θα γινει? for(i=*table;i<=(*table*sizeof(tabletype));i++){} ετσι θα ειναι το for? κατι δεν μου αρεσει ομως.. Πιστεύω δεν είναι καλή ιδέα να διατρέχεις με δείκτες πολυδιάστατους πίνακες, κυρίως διότι υπάρχουν περισσότεροι του ενός τρόποι, κανένας εκ των οποίων δεν εμπεδώνεται εύκολα αν δεν εισαι ήδη πολύ καλά εξοικειωμένος με τους δείκτες. Εξαρτάται επίσης και πως έχεις ορίσει τον 2Δ πίνακά σου (π.χ. είναι στατικά ορισμένος ή δυναμικά; Αν είναι δυναμικά, έχει ή κάθε του γραμμή ίδιο μήκος ή η κάθε γραμμή μπορεί να έχει διαφορετικό; Γενικώς, είναι λίγο... βαβουρίτσα Τι πρόβλημα έχεις με τους απλούς indexers i και j? απλη ακαδημαικη περιεργεια! με indexes i και j μια χαρα το εχω καταλαβει,απλα θελω να ξετριψω λιγο και με τους pointers.. τωρα στατικα εχω ορισει τους πινακες,στο συγκεκριμενο test-Παραδειγμα,που φτιαχνω για εξασκηση..θεωρητικα αφου η C αραδιαζει τους πινακες τους δυσδιαστατους στην μνημη την μια σειρα μετα την αλλη,σκεφτηκα οτι θα ηταν πιο απλο,γιαυτο ρωτησα. αν ειναι μεγαλη βαβουρα,δωσε υλικο για να διαβασω για pointers μεχρι να φτασω σε ικανοποιητικο επιπεδο. υγ:τους δεικτες ξερω να τους χρησιμοποιω γενικα,αλλα σε απλα πραγματα ακομα.
migf1 Δημοσ. 20 Δεκεμβρίου 2012 Δημοσ. 20 Δεκεμβρίου 2012 Αν ανατρέξεις μερικές σελίδες πίσω σε αυτό το νήμα (δεν θυμάμαι πόσες) θα βρεις 2-3 σελίδες μαζεμένες όπου αναλύουμε συγκεκριμένα 2D traversing με χρήση δεικτη... κάπου εκεί μέσα έχω δώσει και γρήγορο κώδικα ακριβώς για αυτό, και links με benchmarks. Έλα, το βρήκα στα... κιτάπια μου τελικά... και είναι όπως το θέλεις (στατικά οιρισμένος δλδ ο arr2d με fixed length rows... /* -------------------------------------------------- * * -------------------------------------------------- */ int arr2d_sum_elements( int arr2d[][NCOLS], int nrows ) { int sum = 0; if ( !arr2d || nrows < 1 ) return INT_MIN; for (int i=0; i < nrows; i++) for (int j=0; j < NCOLS; j++) sum += arr2d[i][j]; return sum; } /* -------------------------------------------------- * * -------------------------------------------------- */ int arr2d_sumElements( int arr2d[][NCOLS], int nrows ) { int sum = 0; // sanity check if ( !arr2d || nrows < 1 ) return INT_MIN; // actual calc #if 1 int *walk = (int *)arr2d; // address of arr2d's 1st int element int *stop = ((int *)arr2d + nrows * NCOLS); // address of arr2d's last int element while ( walk < stop ) sum += *walk++; #else for (int *walk = (int *)arr2d; walk < ((int *)arr2d + nrows * NCOLS); walk++) sum += *walk; #endif return sum; } /* -------------------------------------------------- * * -------------------------------------------------- */ int main( void ) { int arr2d[NROWS][NCOLS] = { {10, 20, 30}, {40, 50, 60} }; arr2d_print( arr2d, NROWS ); printf( "sum: %d\n", arr2d_sum_elements(arr2d, NROWS) ); printf( "sum: %d\n", arr2d_sumElements(arr2d, NROWS) ); system("pause"); exit( EXIT_SUCCESS ); } ψάξε αν είναι στο νήμα και για άλλους τρόπους, καθώς και για αναλύσεις (που σου είπα πριν).
migf1 Δημοσ. 20 Δεκεμβρίου 2012 Δημοσ. 20 Δεκεμβρίου 2012 Τίποτα ρε συ ΥΓ. το έκανα λίγο edit τον κώδικα (σε περίπτωση που δεν σε πρόλαβα). EDIT: Βρήκα και τις σελίδες του νήματος τελικά: συν/πλην από αυτήν εδώ: http://www.insomnia.gr/topic/437533-%CE%B5%CF%81%CF%89%CF%84%CE%AE%CF%83%CE%B5%CE%B9%CF%82-%CE%B3%CE%B9%CE%B1-c/page-64 1
Star_Light Δημοσ. 20 Δεκεμβρίου 2012 Δημοσ. 20 Δεκεμβρίου 2012 >Δεν το πιάνω τι εννοει οταν λεει οτι ολα τα ονοματα που ξεκινουν με str και ενα lower-case letter ειναι δεσμευμενα για μελλοντικη χρηση σε συναρτησεις των strings πχ αμα ορισω μια strman(...) δεν μου κτυπαει ο compiler..... ειναι φυσιολογικο αυτο? > Γιατι αν χρησιμοποιήσω μια στανταρ συνάρτηση της C για strings αλλα χωρις το header string.h δεν βαραει και παλι ο comp???? > Πως η strcmp δέχεται const char * αλλα δεν δινει warn ο comp ακομη και αν της περάσεις σκέτο char * ??? μηπως επειδη δεν ειναι σιγουρο αν ο εκαστοτε compiler υλοποιεί την strcmp οπως την παρουσιάζει ενα βιβλιο πχ?
Προτεινόμενες αναρτήσεις