psychogamer Δημοσ. 15 Ιανουαρίου 2015 Δημοσ. 15 Ιανουαρίου 2015 /* ξερεται μηπως γιατι ο μεταγλωτιστης δε μου βγαζει το πληθος?? */ #include <stdio.h> #include <string.h> main() { char a[10]; int i,len,times; printf("enter text :"); gets(a); len=strlen(a); for(i=0;i<len;i++) { if(a='k') (times++); } printf("toses %c",times); system("pause"); return 0; } ωχ ειχα κανει λαθος στη printf και εβαλα %c αντι για %d αλλα και παλι δε μου ωβγαζει π.χ σωστα το ποσες φορες εμφανιστηκε επρεπε να βαλω == βγαζει και εναν παραπανω χαρακτηρα φταιει μαλλον οτι ειναι και μυδενικος /0 που τον μετραει ,,,,..............
nucleus Δημοσ. 15 Ιανουαρίου 2015 Δημοσ. 15 Ιανουαρίου 2015 Για δώσε μια αρχική τιμή στην times δηλαδή times = 0 Επίσης ο τελεστής για έλεγχο ισότητας είναι == το = είναι τελεστής ανάθεσης. if(a[i] == 'k') (times++); 1
psychogamer Δημοσ. 15 Ιανουαρίου 2015 Μέλος Δημοσ. 15 Ιανουαρίου 2015 επρεπε να την αρχικοποιησω δικιο ειχες αν και το κανα καπως διαφορετικα εγω ,, εγραψα στο τελος times=(times-1); και μου βγηκε σωστο thanks παντως αμα θελω να το κανω με pointres υπαρχει καποιος τροπος π.χ με την malloc ?? ισως?
Moderators Kercyn Δημοσ. 15 Ιανουαρίου 2015 Moderators Δημοσ. 15 Ιανουαρίου 2015 Πρέπει να αρχικοποιείς τις μεταβλητές σου πριν τις χρησιμοποιήσεις. Το ότι έτυχε να δουλέψει αυτή τη φορά δε σημαίνει ότι θα δουλεύει πάντα. Επίσης, η strlen σου δίνει τον αριθμό των χαρακτήρων μέχρι το πρώτο /0, χωρίς να το μετράει. 1
nucleus Δημοσ. 15 Ιανουαρίου 2015 Δημοσ. 15 Ιανουαρίου 2015 αμα θελω να το κανω με pointres υπαρχει καποιος τροπος π.χ με την malloc ?? ισως? Μπορεί να γίνει και με pointers Για την malloc http://www.cplusplus.com/reference/cstdlib/malloc/ 1
migf1 Δημοσ. 15 Ιανουαρίου 2015 Δημοσ. 15 Ιανουαρίου 2015 ... αμα θελω να το κανω με pointres υπαρχει καποιος τροπος π.χ με την malloc ?? ισως? Για να μετρήσεις τη συχνότητα εμφάνισης του 'k' δεν χρειάζεσαι malloc()... malloc() (και αντίστοιχα free()) θα χρειαζόσουν αν ήθελες να δημιουργήσεις τη συμβολοσειρά στην heap memory (τώρα την έχεις δημιουργήσει στατικά στην stack memory). Ένας τρόπος για να μετρήσεις συχνότητα με τη βοήθεια ενός δείκτη cp (ανεξάρτητα του πως έχεις δημιουργήσει τη συμβολοσειρά) είναι ο παρακάτω: Κώδικας: #include <stdio.h> #include <stdlib.h> int main( void ) { char s[BUFSIZ] = {'\0'}; int times = 0; char *cp = NULL; printf( "enter text:" ); fflush( stdout ); fgets( s, BUFSIZ, stdin ); for (cp=s; '\0' != *cp; cp++) { if ( 'k' == *cp ) { times++; } } printf( "toses %d\n", times ); system( "pause" ); return 0; } Σημείωση: H gets() έχει καταργηθεί από τη γλώσσα. Επίσης και το main() (βγάζει warning) θέλει: int main( void ) Ένας άλλος πιο δυσνόητος τρόπος (και εν πολλοίς άχρηστος εδώ) που χρησιμοποιεί την strchr() αντί να ελέγχει για '\0' είναι αυτός: Κώδικας: #include <stdio.h> #include <stdlib.h> #include <string.h> int main( void ) { char s[BUFSIZ] = {'\0'}; int times = 0; char *cp = NULL; printf( "enter text:" ); fflush( stdout ); fgets( s, BUFSIZ, stdin ); cp = s; while ( NULL != (cp=strchr(cp,'k')) ) { times++; cp++; } printf( "toses %d\n", times ); system( "pause" ); return 0; } Αν θέλεις την συμβολοσειρά να τη δημιουργήσεις στην heap memory, ο πρώτος κώδικας μπορεί να αλλάξει σε κάτι σαν κι αυτόν: Κώδικας: #include <stdio.h> #include <stdlib.h> int main( void ) { int times = 0; char *cp = NULL; char *s = malloc( BUFSIZ ); if ( NULL == s ) { fputs( "*** error: possibly out of memory, bye...", stderr ); return 1; } printf( "enter text: " ); fflush( stdout ); fgets( s, BUFSIZ, stdin ); for (cp=s; '\0' != *cp; cp++) { if ( 'k' == *cp ) { times++; } } printf( "toses %d\n", times ); free( s ); system( "pause" ); return 0; } Αν δεν έχετε κάνει ακόμα δείκτες, νομίζω είναι καλύτερη ιδέα να περιμένεις πρώτα να κάνετε.
getwinner Δημοσ. 15 Ιανουαρίου 2015 Δημοσ. 15 Ιανουαρίου 2015 μπορεις στη for αντι για i<len να βαλεις s[i+1]!='\0'
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα