Προς το περιεχόμενο

Πρόβλημα σε C


thanos713

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα, θέλω να φτιάξω ένα πρόγραμμα που να παίρνει τον δεκαδικό κωδικό του 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");

Δημοσ.

>
#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 που αναφέρεις αλλά το

πόσα γράμματα έγραψε τελικά.

Δημοσ.

Το βασικό λάθος είναι ότι το 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: Με πρόλαβε οριακά ο προηγούμενος, αλλά ούτως ή άλλως η λύση που δώσαμε είναι διαφορετική.

Δημοσ.

Ναι, το πρόσεξα όταν το είδα κ στο δικό σου κώδικα κ λέω δεν γίνεται να μην το πρόσεξε κ εκεί κατάλαβα τη γκάφα μου..

Δημοσ.
>
#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 που αναφέρεις αλλά το

πόσα γράμματα έγραψε τελικά.

 

Δεν εννοούσα ακριβώς την λύση αλλά αφού μου δόθηκε... Ευχαριστώ πολύ.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...