epir21 Δημοσ. 7 Δεκεμβρίου 2011 Δημοσ. 7 Δεκεμβρίου 2011 Καλησπέρα.. Έχω μια άσκηση να κάνω για την σχολη μου και μου λέει να διαβάσω συμβολοσειρά (μέχρι 20 χαρακτήρες).. Διαβάζω κανονικά την συμβολοσειρά αλλα για πρόταση με κενά,οταν την εμφανίζω μου βγάζει μόνο την πρώτη λέξη.. πχ αν δώσω "Καλημέρα Κόσμε",θα εμφανίσει μόνο το Καλημέρα.. Και έτσι αναγκαστικά πρέπει να δώσω "Καλημέρα_Κόσμε".. Αν μπορεί να βοηθήσει κάποιος,περιμένω..Αν χρειαστεί θα ανεβάσω και τον κώδικα.. Σόρρυ αν είναι τόσο εύκολο απλα δεν έχω ξανασχοληθέι με συμβολοσειρές.. Ευχαριστώ εκ των προτέρων..
gallaki Δημοσ. 7 Δεκεμβρίου 2011 Δημοσ. 7 Δεκεμβρίου 2011 Αν θυμάμαι καλά μπορείς να διαβάσεις συμβολοσειρά έτσι. >char W[100]; scanf("%s" &W); Και θα πάει και θα βάλει σε κάθε θέση του πίνακα ένα ένα τα γράμματα και όπου έχει κενά θα τα εμφανίσει κανονικά.
epir21 Δημοσ. 7 Δεκεμβρίου 2011 Μέλος Δημοσ. 7 Δεκεμβρίου 2011 Ευχαριστώ και τους δυο για της απαντήσεις σας.. δοκίμασε την fgets Link Δοκίμασα πιο πριν με την gets αλλα μου έβγαλε σφάλμα το πρόγραμμα που χρησιμοποιώ οτι δεν είναι καλο να χρησιμοποιώ την gets(ότι να ναι)..Θα δοκιμάσω με την fgets.. Αν θυμάμαι καλά μπορείς να διαβάσεις συμβολοσειρά έτσι. >char W[100]; scanf("%s" &W); Και θα πάει και θα βάλει σε κάθε θέση του πίνακα ένα ένα τα γράμματα και όπου έχει κενά θα τα εμφανίσει κανονικά. Αυτό κάνω φίλε μου αλλα όπως είπα μου κρατάει μόνο την πρώτη λέξη απο την πρόταση:/
gallaki Δημοσ. 7 Δεκεμβρίου 2011 Δημοσ. 7 Δεκεμβρίου 2011 Ε τότε δοκίμασε αυτό που είπε ο virxen >char x[50]; int length; gets(x); length=strlen(x); και με την strlen βρίσκεις πόσα γράμματα έχουν μπεί στον πίνακα
nikos903 Δημοσ. 7 Δεκεμβρίου 2011 Δημοσ. 7 Δεκεμβρίου 2011 Δεν έχω Compiler μπροστά μου να δοκιμάσω αλλα για δες: scanf(" %[^\n]s", text); Βασικά αμα ψάξεις την scanf μπορείς να ορίσεις μέχρι που να πάρει.
epir21 Δημοσ. 7 Δεκεμβρίου 2011 Μέλος Δημοσ. 7 Δεκεμβρίου 2011 Δεν έχω Compiler μπροστά μου να δοκιμάσω αλλα για δες: scanf(" %[^\n]s", text); Βασικά αμα ψάξεις την scanf μπορείς να ορίσεις μέχρι που να πάρει. ωραίος φίλε μου..δουλεύει.. Και τελευταίο.. Ενα απο τα ερωτήματα λεεί αν δημιουργήσω άλλη συμβολοσειρά που να περιέχεί απο αυτή που έχω διαβάσει,τα γράμματα..δηλαδα όχι σύμβολα και αριθμούς.. Ο κώδικας που έχω γράψει είναι αυτος: > i=0; while(str[i]) { c=str[i]; if( isalpha(c)) str3[i]=c; i++; } printf("H simvoloseira xwris simvola i xaraktires einai:%s\n",str3); Αλλα εδώ ακόμα μου εμφανίζει μόνο την πρώτη λέξη..Δοκίμασα να βάλω στην if το >if( isalpha(c) || str[i]==" ") αλλα και πάλι τιποτα..καμία ιδέα?
gallaki Δημοσ. 7 Δεκεμβρίου 2011 Δημοσ. 7 Δεκεμβρίου 2011 ωραίος φίλε μου..δουλεύει.. Και τελευταίο.. Ενα απο τα ερωτήματα λεεί αν δημιουργήσω άλλη συμβολοσειρά που να περιέχεί απο αυτή που έχω διαβάσει,τα γράμματα..δηλαδα όχι σύμβολα και αριθμούς.. Ο κώδικας που έχω γράψει είναι αυτος: > i=0; while(str[i]) { c=str[i]; if( isalpha(c)) str3[i]=c; i++; } printf("H simvoloseira xwris simvola i xaraktires einai:%s\n",str3); Αλλα εδώ ακόμα μου εμφανίζει μόνο την πρώτη λέξη..Δοκίμασα να βάλω στην if το >if( isalpha(c) || str[i]==" ") αλλα και πάλι τιποτα..καμία ιδέα? για την str3 θέλεις άλλον μετρητή γιατί αν πχ έχεις το Γιώ4ργος θα σου εμφανίσει Γιώ ργος με κενό. Για το 2ο πάρε την strlen που σου είπα και βάλτο σε μία for απο ι μέχρι strlen.
migf1 Δημοσ. 7 Δεκεμβρίου 2011 Δημοσ. 7 Δεκεμβρίου 2011 Δεν έχω Compiler μπροστά μου να δοκιμάσω αλλα για δες: scanf(" %[^\n]s", text); Βασικά αμα ψάξεις την scanf μπορείς να ορίσεις μέχρι που να πάρει. Αυτό όμως δεν διαβάζει μέχρι 20 χαρακτήρες! Επίσης η scanf είναι σχεδόν αδύνατον να θυμάται κανείς απέξω όλες τις παραμέτρους της ώστε να τις χρησιμοποιεί χωρίς να χρειάζεται να ανατρέξει στην τεκμηρίωσή της. Για να διαβάσεις συμβολοσειρά μέχρι Χ χαρακτήρες, το πιο συνηθισμένο είναι με: fgets( str, X+1, stdin); για την οποία πρέπει να θυμάται κανείς μονάχα πως κρατάει και το τελικό ENTER μέσα στο str (για αυτό και το X+1 αντί για X στις παραμέτρους της. Οπότε για να το αφαιρέσουμε πρέπει μετά να πάμε να μηδενίσουμε το τελευταίο διαβασμένο χαρακτήρα του str: str[ strlen(str) ] = '\0'; Πάντως το πιο εύκολο από όλα (για μένα) είναι να γράψει κανείς μια δικιά του συνάρτηση που να διαβάζει μέχρι X χαρακτήρες, χωρίς να κρατάει το ENTER... και που τελικά νομίζω είναι και το ζητούμενο της άσκησης!
epir21 Δημοσ. 7 Δεκεμβρίου 2011 Μέλος Δημοσ. 7 Δεκεμβρίου 2011 για την str3 θέλεις άλλον μετρητή γιατί αν πχ έχεις το Γιώ4ργος θα σου εμφανίσει Γιώ ργος με κενό. Για το 2ο πάρε την strlen που σου είπα και βάλτο σε μία for απο ι μέχρι strlen. Το κουλό είναι ότι δεν μου εμφανίζει Γιώ ργος σε αυτή την περίπτωση αλλα Γιώ Δηλαδή μόλις βρεί σύμβολο ή γράμμα,σταματάει στην ουσία να περνάει στον str3 τα υπόλοια γράμματα.. Με έχει εκνεβρίσει χαχα
nilosgr Δημοσ. 7 Δεκεμβρίου 2011 Δημοσ. 7 Δεκεμβρίου 2011 >if( isalpha(str[i]) || str[i]==' ') αυτο ειναι το σωστο, με διπλα εισαγωγικα σημαινει string και με τον τελεστη == δεν μπορουμε να συγκρινουμε strings Επισης δεν χρειαζεται καν το >c=str[i];
gallaki Δημοσ. 7 Δεκεμβρίου 2011 Δημοσ. 7 Δεκεμβρίου 2011 με while το έκανες ή με for? Στην while που έχεις κάνει δεν μπορώ να καταλάβω πότε σταματάει. Αν κάνεις μια φορ απο ι μέχρι strlen αναγκάστικά θα τρέξει για όλα τα γράμματα και απλά θα έχεις έναν δεύτερο μετρητή για την καινούργια πρόταση που θα φτιάξεις χωρίς τα νούμερα. >int main() { char str[50],c,str3[50],k ; int i, j=0, length,x; gets(str); length = strlen(str); for (i=0; i<length ; i++) { c=str[i]; if( isalpha(c) || c==' ') { str3[j]=c; j++; } } printf("%s", str3); } επειδή με κόλλησες ορίστε
epir21 Δημοσ. 7 Δεκεμβρίου 2011 Μέλος Δημοσ. 7 Δεκεμβρίου 2011 Λοιπόν nilosgr έχει δίκιο και μου έλυσε ένα πρόβλημα αυτό.. Έβαλα και τον μετρητή που μου είπες gallaki αλλά: Όλα τα άλλα ερωτήματα μου βγαίνουν σωστά.. Σε αυτό που μας καίει οταν βάζω πχ:"Γεια σου γιαννη" μου εμφανιζει Γεια σου γιαννη,δηλαδή comple.. Ενώ οταν βάλω "Γεια45 σου γιάννη",μου εμφανίζει Γεια..Δηλαδή σταματαει στο 4:/ με while το έκανες ή με for? Στην while που έχεις κάνει δεν μπορώ να καταλάβω πότε σταματάει. Αν κάνεις μια φορ απο ι μέχρι strlen αναγκάστικά θα τρέξει για όλα τα γράμματα και απλά θα έχεις έναν δεύτερο μετρητή για την καινούργια πρόταση που θα φτιάξεις χωρίς τα νούμερα. >int main() { char str[50],c,str3[50],k ; int i, j=0, length,x; gets(str); length = strlen(str); for (i=0; i<length ; i++) { c=str[i]; if( isalpha(c) || c==' ') { str3[j]=c; j++; } } printf("%s", str3); } επειδή με κόλλησες ορίστε αυτό έχω κάνει απλα με λίγες αλλαγές στις εκχωρήσεις αλλα δεν αλλάζει κάτι στο νόημα.. Και γίνεται ότι λέω απο πάνω.. να και ο κώδικας: >j=0; for(i=0;i<strlen(str);i++) { if( isalpha(str[i]) || str[i]==' '){ str3[i]=str[i]; j++; } } printf("H simvoloseira xwris simvola i xaraktires einai:%s\n",str3);
migf1 Δημοσ. 7 Δεκεμβρίου 2011 Δημοσ. 7 Δεκεμβρίου 2011 Επειδή δεν πρέπει να στο δώσουμε στο πιάτο, κι επειδή θεωρώ πως η εισαγωγή μέχρι 20 χαρακτήρες είναι πιο στοιχειώδης από τον διαχωρισμό των μη-ψηφίων, με την προϋπόθεση πως θα φτιάξεις την εισαγωγή (π.χ. σε μια συνάρτηση: sget( char *s, int size) ) σου δίνω και τον υπόλοιπο κώδικα. Όχι όμως στο πιάτο, αλλά με δείκτες, που προφανώς δεν έχετε κάνει ακόμα... ελπίζοντας πως θα σε βοηθήσει να δεις τη λογική ροή... > #include <stdio.h> #include <ctype.h> #define STRSIZE 20+1 /* ----------------------------------- */ char *sget( char *str, int size ) { if ( !str ) return NULL; /* read up to size-1 chars into str, nul-terminate & return it */ return str; } /* ----------------------------------- */ int main( void ) { char s1[ STRSIZE ] = {'\0'}, s2[ STRSIZE ] = {'\0'}; register char *cp1 = s1, *cp2 = s2; printf("Enter s1 (chars beyond %d will be ignored): ", STRSIZE-1 ); sget( s1, STRSIZE ); printf("your entered s1:\n\t %s\n\n", s1); /* * copy to s2 only those chars of s1 that are not digits * !!! only works if s2's total space is at least as large as s1's !!! */ for (; *cp1; cp1++) if ( !isdigit( (int)*cp1 ) ) *cp2++ = *cp1; *cp2 = '\0'; printf("s2 (non-digit chars of s1):\n\t%s\n\n", *s2 ? s2 : "<s1 was empty or its chars were all digits>"); return 0; } EDIT: Ορθογραφικά και μερικά σχόλια
gallaki Δημοσ. 7 Δεκεμβρίου 2011 Δημοσ. 7 Δεκεμβρίου 2011 να και ο κώδικας: >j=0; for(i=0;i<strlen(str);i++) { if( isalpha(str[i]) || str[i]==' '){ str3[i]=str[i]; j++; } } printf("H simvoloseira xwris simvola i xaraktires einai:%s\n",str3); >str3[i]=str[i]; αυτό πρέπει να γίνει j >str3[j]=str[i]; γράψε λίγο και πως διαβάζεις την συμβολοσειρά
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα