thanos713 Δημοσ. 23 Φεβρουαρίου 2010 Δημοσ. 23 Φεβρουαρίου 2010 Καλησπέρα, θέλω να φτιάξω ένα πρόγραμμα που να παίρνει τον δεκαδικό κωδικό του ASCII κάθε γράμματος από μια λέξη που θα του δίνεις και να προσθέτει δύο σε κάθε του γράμμα, άμα δηλαδή βάλω than, να βγάλει 119107100110. Έχω σκεφτεί κάτι τέτοιο αλλά το ξέρω ότι είναι λάθος, μπορεί να μου το εξηγήσει κάποιος? > char leksi[80], apotelesma[80]; int length,i; printf("Βαλε λέξη: "); scanf("%s", &leksi); length = strlen(leksi); strcpy(apotelesma,""); for (i=0; i<=length; ++i) { strcat(apotelesma,apotelesma + (leksi[i] + 2)); } printf("Αποτέλεσμα: %s \n", apotelesma); system("pause");
_tasos Δημοσ. 23 Φεβρουαρίου 2010 Δημοσ. 23 Φεβρουαρίου 2010 [EDIT] Λάθος tip.Το σβήνω πριν γίνουμε κ ρεζίλι...
virxen75 Δημοσ. 23 Φεβρουαρίου 2010 Δημοσ. 23 Φεβρουαρίου 2010 > #include <stdio.h> #include <stdlib.h> #include <string.h> #define addValue 2 int main(){ char leksi[80], apotelesma[80]={""}; int length,i; printf("leksi: "); scanf("%s", &leksi); length = strlen(leksi); for (i=0; i<length; ++i) { int ascii=(int)leksi[i];//μετατροπή σε ακέραιο (δεκαδική τιμή ascii) printf("\nascii=%d",ascii); ascii+=addValue;//προσθέτω 2 π.χ. printf("\nascii++=%d",ascii); char ascii2string[10]; itoa(ascii,ascii2string,10);//μετατρέπω τον ακέραιο σε string printf("\nascii2string=#%s#",ascii2string); strcat(apotelesma,ascii2string);//ενσωματώνω στο τέλος του πρώτου το 2ο string printf("\nresult=%s",apotelesma); } printf("result: %s \n", apotelesma); system("pause"); return 0; } ---------- Προσθήκη στις 20:33 ---------- Προηγούμενο μήνυμα στις 20:31 ---------- Ένα λάθος που κάνεις είναι ότι κάνεις traverse και τους 80 χαρακτήρες του πίνακα leksi ενώ μπορεί να έχει μόνο 5, π.χ. tasos. Μπορείς να βάλεις έναν έλεγχο για αν ο χαρακτήρας είναι ο '\0' που σημαίνει τέλος συμβολοσειράς, και αν είναι να σταματάει το loop της for, ή να το γράψεις με while (πιο sexy κώδικας έτσι ). Επίσης ο πίνακας apotelesma θα πρέπει να έχει περισσότερες θέσεις, αν βάλεις μεγάλη εισόδο το αποτέλεσμα θα είναι μεγαλύτερο από 80 χαρακτήρες. το length που έχει στον κώδικα δεν είναι το 80 που αναφέρεις αλλά το πόσα γράμματα έγραψε τελικά.
tespa_2002 Δημοσ. 23 Φεβρουαρίου 2010 Δημοσ. 23 Φεβρουαρίου 2010 Το βασικό λάθος είναι ότι το strcat περιμένει ως 2η παράμετρο να πάρει ένα string (δηλαδή ένα πίνακα από χαρακτήρες που τελειώνει σε \0) και εσύ του δίνεις ένα χαρακτήρα. Ένα ακόμα λάθος είναι το &leksi στη scanf. Η scanf περιμένει σαν παράμετρο ένα char *. Το όνομα ενός μονοδιάστατου πίνακα χαρακτήρων είναι συντακτικά char *, άρα δε χρειάζεται & μπροστά του. Το 3ο λάθος είναι το <= στο for. Αυτό θα σε κάνει να διαβάσεις ένα χαρακτήρα παραπάνω από όσο πρέπει. Αν το string έχει 5 χαρακτήρες, αυτοί βρίσκονται στις θέσεις 0 έως και 4. Δοκίμασε να κατασκευάσεις το apotelesma χαρακτήρα προς χαρακτήρα χρησιμοποιώντας αριθμητική χαρακτήρων. Είναι κάτι τέτοιο: > char leksi[80], apotelesma[80]; int length,i; printf("Βαλε λέξη: "); scanf("%s", leksi); length = strlen(leksi); for (i=0; i<length; ++i) { apotelesma[i] = leksi[i] + 2; } apotelesma[i] = '\0'; printf("Αποτέλεσμα: %s \n", apotelesma); system("pause"); Edit: Με πρόλαβε οριακά ο προηγούμενος, αλλά ούτως ή άλλως η λύση που δώσαμε είναι διαφορετική.
_tasos Δημοσ. 23 Φεβρουαρίου 2010 Δημοσ. 23 Φεβρουαρίου 2010 Ναι, το πρόσεξα όταν το είδα κ στο δικό σου κώδικα κ λέω δεν γίνεται να μην το πρόσεξε κ εκεί κατάλαβα τη γκάφα μου..
thanos713 Δημοσ. 23 Φεβρουαρίου 2010 Μέλος Δημοσ. 23 Φεβρουαρίου 2010 > #include <stdio.h> #include <stdlib.h> #include <string.h> #define addValue 2 int main(){ char leksi[80], apotelesma[80]={""}; int length,i; printf("leksi: "); scanf("%s", &leksi); length = strlen(leksi); for (i=0; i<length; ++i) { int ascii=(int)leksi[i];//μετατροπή σε ακέραιο (δεκαδική τιμή ascii) printf("\nascii=%d",ascii); ascii+=addValue;//προσθέτω 2 π.χ. printf("\nascii++=%d",ascii); char ascii2string[10]; itoa(ascii,ascii2string,10);//μετατρέπω τον ακέραιο σε string printf("\nascii2string=#%s#",ascii2string); strcat(apotelesma,ascii2string);//ενσωματώνω στο τέλος του πρώτου το 2ο string printf("\nresult=%s",apotelesma); } printf("result: %s \n", apotelesma); system("pause"); return 0; } ---------- Προσθήκη στις 20:33 ---------- Προηγούμενο μήνυμα στις 20:31 ---------- το length που έχει στον κώδικα δεν είναι το 80 που αναφέρεις αλλά το πόσα γράμματα έγραψε τελικά. Δεν εννοούσα ακριβώς την λύση αλλά αφού μου δόθηκε... Ευχαριστώ πολύ.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.