Vagouridis Οκτώβριος 23, 2005 #21 Κοινοποίηση Οκτώβριος 23, 2005 Αρχική απάντηση από ---Zapotek-- #include <stdlib.h>int main() {char x='a';int j;j=atoi(&x);}Κανει compile...[ http://www.cppreference.com/stdstring/atoi.html ] Εδω θα κανει , για ουσιαστικα οριζεις την χ με αρχικη τιμη και χρησιμοποιεις μετα δεικτη .Τσπ αυτο που θελω να πω ειναι οτι ειναι καλυτερο χρησιμοποιωντας τον κωδικα απο την ατοι την να φταιξεις την δικια σουαναλογη συναρτηση. Link to comment Share on other sites More sharing options...
---Zapotek-- Οκτώβριος 23, 2005 Author #22 Κοινοποίηση Οκτώβριος 23, 2005 Οταν έχω χρόνο μπορεί να δοκιμάσω, έτσι από πισμα...Απλα προς το παρόν μου φτάνει που βρήκα κάτι να δουλεύει... Link to comment Share on other sites More sharing options...
DarkSaga Οκτώβριος 23, 2005 #23 Κοινοποίηση Οκτώβριος 23, 2005 αν δεν λύσεις σήμερα απο πείσμα μην περιμένεις να γυρίσεις αυριο.... Link to comment Share on other sites More sharing options...
frap Οκτώβριος 23, 2005 #24 Κοινοποίηση Οκτώβριος 23, 2005 Συγχέετε τους τύπους string (char *) και χαρακτήρας (char).Στη C τα strings χαρακτήρων (char *) περικλείονται με διπλά εισαγωγικά και τερματίζονται με ένα μηδενικό byte αυτόματα από την γλώσσα. Οι χαρακτήρες περικλείονται με μονά εισαγωγικά και είναι ένα και μοναδικό byte (για ι386 τουλάχιστον), το ascii του χαρακτήρα. Το ascii του χαρακτήρα πχ. A είναι απλά 'Α' ! (μονά εισαγωγικά)H αναπαράσταση στην μνήμη ενός χαρακτήρα, 'Α' είναι 64 (ascii)Η πρόταση ('Α' == 64) είναι αληθήςΗ αναπαράσταση ενός string "ABC" στην μνήμη είναι: 'A' 'B' 'C' 0 (<- μηδέν, τιμή, όχι χαρακτήρας) Tο να πούμε char a = 64; ή char a = 'A'; είναι δύο ισοδύναμες εκφράσεις με την δεύτερη να είναι πιο ξεκάθαρη στο μάτι.Επίσης:Οι atoi και itoa μετατρέπουν ένα string με αριθμητικούς χαρακτήρες (0,1,2,..,9) σε integer και το ανάποδο... δλδ το "12478432" <-> 12478432. Δεν θα δουλέψουν με παράμετρο τύπου char....Όσο για αυτό,char x='a';int j;j=atoi(&x);Αυτό που κάνεις είναι να παίρνεις ένα pointer τύπου char , από το &x, και να το περνάς ως αρχή ενός string σε μια function (atoi) που περιμένει να διαβάσει τέτοιο. Αυτό που θα κάνει η atoi θα είναι να διαβάζει όλα τα bytes από την διεύθυνση μνήμης που υποδεικνύει το &x μέχρι να βρεί ένα μηδενικό. Aν το παραπάνω βγάζει σωστό αποτέλεσμα είναι καθαρά θέμα τύχης. Αν επίσης δεν σκάει το πρόγραμμα είναι επίσης θέμα τύχης (γιατί θα μπορούσε κάλιστα να μην υπάρχει κανένα μηδενικό από το &x μέχρι το τέλος του address space που τρέχει το πρόγραμμά σου...)Σύμφωνα με τα παραπάνω το σωστό ήταν να γράψεις:char x='a';int j;j=x;που όπως είναι φανερό είναι πλεονασμός...-Κ. Link to comment Share on other sites More sharing options...
Rayden Οκτώβριος 24, 2005 #25 Κοινοποίηση Οκτώβριος 24, 2005 Σχετικά με το atoi, με παρέσυρε το ρεύμα, εννοείται πως η atoi μετατρέπει ένα string σε αριθμό, οπότε το atoi("A") είναι λάθος... (Έχω τόσο καιρό να τις χρησιμοποιήσω!)Προφανώς για μεταβλητές τύπου char αρκεί το (int)('A') (όπως είπε και ο frap), το οποίο διαβάζει το char ως αριθμό. Σε πολλές περιπτώσεις (όπως και στο παράδειγμα που έδωσα πιο πριν) δε χρειάζεται ούτε το casting, το καταλαβαίνει ο compiler. Σόρι αν η σύνταξή μου δεν είναι 100% σωστή, δε μπορώ να το δοκιμάσω, πάντως η ιδέα είναι αυτή. Link to comment Share on other sites More sharing options...
---Zapotek-- Οκτώβριος 28, 2005 Author #26 Κοινοποίηση Οκτώβριος 28, 2005 Δεν ειχα τι να κανω, και για να μην παραπονιεται και ο Dark, οριστε:/*Author: ZapotekDate: 28/10/2005Name: Shift CipherDesc: It takes the letters of a given stringand shifts them with the letters x times in front of them.[X= a given number]Compile with gcc: gcc shift.c -lm*/#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <ctype.h>main(){int len,j,x,enc,key;char alphabet[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};char str[x];printf("Enter string to encrypt: ");scanf("%s",&str);printf("Enter encryption key [1-25]: ");scanf("%d",&key);key=abs(key);if(key>25){printf("Key must be less than 25\n");exit(0);}len=strlen(&str);printf("The encrypted string is: \n");for(x=0; x<len; x++){str[x]= tolower(str[x]);j=str[x]-97;enc = (j + key)%26; printf("%c",alphabet[enc]);} printf("\n");} Link to comment Share on other sites More sharing options...
frap Οκτώβριος 28, 2005 #27 Κοινοποίηση Οκτώβριος 28, 2005 Αρχική απάντηση από ---Zapotek-- [Σήμερα, στις 19:35] int len,j,x,enc,key;...char str[x]; Πρόσεξε λίγο, αυτό είναι σοβαρό λάθος. Σε μεγαλύτερα προγράμματα τέτοιες αβλεψίας σε βγάζουν από τα ρούχα σου μέχρι να τις βρεις... (και πάλι δεν ξέρεις αν τις βρήκες όλες...).Το πρόβλημα: To x δεν έχει αρχικοποιηθεί και το μέγεθος του str κατά συνέπεια είναι απροσδιόριστο.Δουλεύει από τύχη... κοίτα σε εμένα:#include <stdio.h>int main() {int x;char str[x];printf ("%d\n", strlen(str));return 0;}kostas@olympus:~$ gcc -Wall lala.ckostas@olympus:~$ ./a.outSegmentation faultkostas@olympus:~$ Μπορούμε να προχωρήσουμε αν θες κι άλλο: με το scanf δεν κάνεις κανενός είδους έλεγχο για το μήκος του string που διαβάζεις από την είσοδο... κλασσική περίπτωση buffer overflow vulnerability ...-Κ. Link to comment Share on other sites More sharing options...
---Zapotek-- Οκτώβριος 28, 2005 Author #28 Κοινοποίηση Οκτώβριος 28, 2005 Το θέμα με το χ το είχα υπ' όψιν μου αλλά δεν ηθελα να περιορίσω το μέγεθος του array. Οσο για το b.o., ε ένταξη δεν γράφω deamon ένα απλό παράδειγμα έδωσα... Ευχαριστώ πολύ πάντως για το ενδιαφέρoν! Πρόσφατα άρχισα να μαθαίνω C, οπότε είμαι δικαιολογημένος πιστεύω... Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.