Jump to content



C & arrays


---Zapotek--

Recommended Posts

Αρχική απάντηση από ---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

Συγχέετε τους τύπους 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

Σχετικά με το atoi, με παρέσυρε το ρεύμα, εννοείται πως η atoi μετατρέπει ένα string σε αριθμό, οπότε το atoi("A") είναι λάθος... (Έχω τόσο καιρό να τις χρησιμοποιήσω!)

Προφανώς για μεταβλητές τύπου char αρκεί το (int)('A') (όπως είπε και ο frap), το οποίο διαβάζει το char ως αριθμό. Σε πολλές περιπτώσεις (όπως και στο παράδειγμα που έδωσα πιο πριν) δε χρειάζεται ούτε το casting, το καταλαβαίνει ο compiler. Σόρι αν η σύνταξή μου δεν είναι 100% σωστή, δε μπορώ να το δοκιμάσω, πάντως η ιδέα είναι αυτή.

Link to comment
Share on other sites

Δεν ειχα τι να κανω, και για να μην παραπονιεται και ο Dark, οριστε:


/*
Author: Zapotek
Date: 28/10/2005
Name: Shift Cipher
Desc: It takes the letters of a given string
and 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

Αρχική απάντηση από ---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.c
kostas@olympus:~$ ./a.out
Segmentation fault
kostas@olympus:~$

Μπορούμε να προχωρήσουμε αν θες κι άλλο: με το scanf δεν κάνεις κανενός είδους έλεγχο για το μήκος του string που διαβάζεις από την είσοδο... κλασσική περίπτωση buffer overflow vulnerability ...

-Κ.

Link to comment
Share on other sites

Το θέμα με το χ το είχα υπ' όψιν μου αλλά δεν ηθελα να περιορίσω το μέγεθος του array.

Οσο για το b.o., ε ένταξη δεν γράφω deamon ένα απλό παράδειγμα έδωσα...

Ευχαριστώ πολύ πάντως για το ενδιαφέρoν!

Πρόσφατα άρχισα να μαθαίνω C, οπότε είμαι δικαιολογημένος πιστεύω... :p

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

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

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.