Όπως αναφέρεται σε βίντεο της θεωρίας, μπορείς να κάνεις δέσμευση πίνακα από δείκτες και να προχωρήσεις αναλόγως. Εν προκειμένω, θα έπρεπε οι δείκτες να είναι char *, αφού θες πίνακα από συμβολοσειρές, αντί για πίνακα από int * που έχει το παράδειγμα του ua-cam.com/video/K_GXeTL5cbE/v-deo.html
Καλησπερα , το char *pinakas[10] ειναι το ιδιο με το char **pinakas και pinakas=malloc(sizeof(char *)*10)? και τα δυο ουσιαστικα στην μνημη 10 διαδοχικες θεσεις στην μνημη με αποθηκευμενα char pointers δεν ειναι? διοτι την προσπαθησα την ασκηση και την εκανα οπως διαχειριστηκαμε τους πινακες #include #include #include #define N 10 int check_string(char *string); int main() { char **Strings; char buffer[100]; int i,length; Strings=malloc(sizeof(char *)*N); //made an array with 10 strings if(!Strings) { printf(" Couldn't allocate memory! "); exit(0); } for(i=0; i '\0' if(!Strings[i]) { printf(" Couldn't allocate memory! "); exit(0); } /*Copying users string in the array*/ strcpy(Strings[i],buffer); } printf(" The words you gave were: "); for(i=0; i
Ναι έχεις δίκιο, εδώ πάλι έγινε το λάθος της μη αρχικοποιήσης της i στην mystrcopy με αποτέλεσμα να μη βγάζει σωστό αποτέλεσμα. Επίσης το Dev την αρχικοποίησε σε 0 και με ξεγέλασε ;-) Το σωστό είναι: char *mystrcpy(char *dest, char *src) { int i=0; while (1) { dest[i]=src[i]; if (src[i]=='\0') break; i++; } return dest; }
Καλησπέρα. Δηλαδή απο ότι καταλαβαίνω δυναμική δέσμευση μνήμης για είσαγωγή συμβολοσειράς δεν γίνεται χωρίς την χρήση του πίνακα buffer?γίνεται δηλαδή το pc να διαβάζει μία συμβολοσειρά και ανάλογα το μήκος της να δεσμευει χώρο χωρίς κάποιο άλλο ενδιάμεσο πίνακα και να την αποθηκευει?
Μπορείς να κάνεις κάτι καλύτερο με χρήση της συνάρτησης realloc που θα δεις στο μάθημα 21. Στην ουσία αυξάνεις το χώρο μνήμης που έχει ο πίνακας όσο διαβάζεις χαρακτήρες. Όταν φτάσεις στο μάθημα αυτό έχει αυτόν το σύνδεσμο σαν αναφορά: stackoverflow.com/questions/16870485/how-can-i-read-an-input-string-of-unknown-length
Καλησπέρα δάσκαλε, έχω κάνει την εφαργμογή αύτη λίγο διαφορετικά αλλά είναι εξίσου λειτουργική. Για να να είμαι 100% σίγουρος, υπάρχει τρόπος να κάνω printf την μνήμη που δέσμευσα δυναμικά , δηλαδή να μου βγάλει τον αριθμό των bytes που δέσμευσε η malloc για την εκάστοτε λέξη; Ευχαριστώ.
Από τη στιγμή που δε σου επέστρεψε NULL όλα έχουν πάει καλά, δεν έχεις κάποιο λόγο να ανησυχείς. Περαιτέρω για να το ψάξεις, θα μπλεχτείς με πολλές λεπτομέρειες μιας και δεσμεύονται και άλλα μπινελίκια και δεν έχει τύχει να το αναζητήσω. Μια καλή αφετηρία ίσως είναι αυτή η σελίδα: stackoverflow.com/questions/28735770/how-to-get-the-size-of-the-memory-allocated-dynamically
πως θα μπορούσαμε να κάνουμε ένα παρόμοιο πρόγραμμα όπου όμως να μην έχει από την αρχή προκαθορισμένο αριθμό λέξεων που εισάγει ο χρήστης;
Όπως αναφέρεται σε βίντεο της θεωρίας, μπορείς να κάνεις δέσμευση πίνακα από δείκτες και να προχωρήσεις αναλόγως. Εν προκειμένω, θα έπρεπε οι δείκτες να είναι char *, αφού θες πίνακα από συμβολοσειρές, αντί για πίνακα από int * που έχει το παράδειγμα του ua-cam.com/video/K_GXeTL5cbE/v-deo.html
@@psounis ευχαριστω πολυ
Καλησπερα , το char *pinakas[10] ειναι το ιδιο με το char **pinakas και pinakas=malloc(sizeof(char *)*10)? και τα δυο ουσιαστικα στην μνημη 10 διαδοχικες θεσεις στην μνημη με αποθηκευμενα char pointers δεν ειναι? διοτι την προσπαθησα την ασκηση και την εκανα οπως διαχειριστηκαμε τους πινακες
#include
#include
#include
#define N 10
int check_string(char *string);
int main()
{
char **Strings;
char buffer[100];
int i,length;
Strings=malloc(sizeof(char *)*N); //made an array with 10 strings
if(!Strings)
{
printf("
Couldn't allocate memory!
");
exit(0);
}
for(i=0; i '\0'
if(!Strings[i])
{
printf("
Couldn't allocate memory!
");
exit(0);
}
/*Copying users string in the array*/
strcpy(Strings[i],buffer);
}
printf("
The words you gave were:
");
for(i=0; i
Ναι σωστά, το ένα κάνει στατική και το άλλο δυναμική δέσμευση του ίδιου πράγματος.
Μου βγάζει αυτό το output. Δε μπορώ να καταλάβω γιατί...
Simvoloseira: `h¿
Simvoloseira: `h¿
Simvoloseira: `h¿
Simvoloseira: `h¿
Simvoloseira: `h¿
Simvoloseira: `h¿
Simvoloseira: `h¿
Simvoloseira: `h¿
Simvoloseira: `h¿
Simvoloseira: `h¿
Ναι έχεις δίκιο, εδώ πάλι έγινε το λάθος της μη αρχικοποιήσης της i στην mystrcopy με αποτέλεσμα να μη βγάζει σωστό αποτέλεσμα. Επίσης το Dev την αρχικοποίησε σε 0 και με ξεγέλασε ;-)
Το σωστό είναι:
char *mystrcpy(char *dest, char *src)
{
int i=0;
while (1)
{
dest[i]=src[i];
if (src[i]=='\0')
break;
i++;
}
return dest;
}
Ανέβασα και τη διόρθωση στο github.
@@psounis Σας ευχαριστώ πολύ. Αν και θα έπρεπε να το είχα αντιληφθεί και από μόνος μου αυτό το λάθος.
Καλησπέρα. Δηλαδή απο ότι καταλαβαίνω δυναμική δέσμευση μνήμης για είσαγωγή συμβολοσειράς δεν γίνεται χωρίς την χρήση του πίνακα buffer?γίνεται δηλαδή το pc να διαβάζει μία συμβολοσειρά και ανάλογα το μήκος της να δεσμευει χώρο χωρίς κάποιο άλλο ενδιάμεσο πίνακα και να την αποθηκευει?
Μπορείς να κάνεις κάτι καλύτερο με χρήση της συνάρτησης realloc που θα δεις στο μάθημα 21.
Στην ουσία αυξάνεις το χώρο μνήμης που έχει ο πίνακας όσο διαβάζεις χαρακτήρες.
Όταν φτάσεις στο μάθημα αυτό έχει αυτόν το σύνδεσμο σαν αναφορά:
stackoverflow.com/questions/16870485/how-can-i-read-an-input-string-of-unknown-length
@@psounis ευχαριστώ πάρα πολύ για την απάντηση θα το κοιτάξω!
Καλησπέρα δάσκαλε, έχω κάνει την εφαργμογή αύτη λίγο διαφορετικά αλλά είναι εξίσου λειτουργική. Για να να είμαι 100% σίγουρος, υπάρχει τρόπος να κάνω printf την μνήμη που δέσμευσα δυναμικά , δηλαδή να μου βγάλει τον αριθμό των bytes που δέσμευσε η malloc για την εκάστοτε λέξη; Ευχαριστώ.
Από τη στιγμή που δε σου επέστρεψε NULL όλα έχουν πάει καλά, δεν έχεις κάποιο λόγο να ανησυχείς.
Περαιτέρω για να το ψάξεις, θα μπλεχτείς με πολλές λεπτομέρειες μιας και δεσμεύονται και άλλα μπινελίκια και δεν έχει τύχει να το αναζητήσω. Μια καλή αφετηρία ίσως είναι αυτή η σελίδα: stackoverflow.com/questions/28735770/how-to-get-the-size-of-the-memory-allocated-dynamically
Δημήτρη, καλησπέρα! Τα μαθήματα 11 και 12 δεν παίζουν!
Θα είχε ψυχολογικά το yt!