Τα πάντα για την C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την C

Δημοσίευσηαπό Star_Light » 17 Φεβ 2012, 20:10

Έγινε :)

Ωραιος ο κωδικας !! Κατσε να τον κανω ενα paste στο Geany

να του βάλω σχόλια και επανέρχομαι.
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 17 Φεβ 2012, 20:13

Είχα ξεχάσει κι εγώ το free(s) στο τέλος, το έβαλα.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Star_Light » 17 Φεβ 2012, 20:27

Έτοιμο.

http://ideone.com/Jf5uZ

Δες τα σχολια και έχω και μια "απορια"
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 17 Φεβ 2012, 20:36

Κάποια σημεία τα έχεις καταλάβει λάθος, κάνε σύγκριση με τα δικά μου σχόλια (πόσταρε στο μεταξύ και την απορία σου)...

Κώδικας: Επιλογή όλων

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXINPUT 256+1 /* max # of chars to read from stdin */
int main( void )
{
char input[ MAXINPUT ] = {'\0'}; /* c-string, for reading 1 stdin line*/
char *s = NULL; /* c-string (read from stdin) */
int maxlen = 0; /* max len of s (read from stdin) */
int len = 0; /* current len of s (will calculate) */

do {
printf("Give the len: ");
fgets( input, MAXINPUT, stdin );/* read the whole stdin line as input */
maxlen = atoi(input); /* convert to int & assign to maxlen */
} while ( maxlen < 1 ); /* demand positive, non-zero maxlen */

maxlen++; /* for the '\0' at the end */
s = calloc(maxlen, sizeof(char)); /* alloc memory & make s point to it */
if ( !s ) { /* mem allocation failed */
fputs("*** error, out of memory!\n", stderr);
exit( EXIT_FAILURE ); /* exit program with failure signal */
}

printf("Give a string : ");
fgets(s, maxlen, stdin); /* read s directly from stdin */

len = strlen(s); /* calc current len of given s */
if ( s[ len-1 ] == '\n' ) /* check if s has a '\n' before '\0'*/
s[ len-1 ] = '\0'; /* ... and remove it if it has */

printf("You gave the string: %s\n", s);

system("pause");

free( s ); /* release mem reserved for s */
exit( EXIT_SUCCESS);
}

Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Star_Light » 17 Φεβ 2012, 20:53

Αν σαν είσοδο δώσεις το Kostas

Toτε το len που επιστρέφεται απο την strlen(s) είναι 6

οποτε εσυ πας στο s[5] δηλαδη στο s το τελικο και βλέπεις αν ειναι '\n' .

Τον έλεγχο εσυ τον έχεις δώσει μονο που σε περίπτωση ο χρήστης δώσει
μήκος μεγαλύτερο απο αυτο που τελικά θα αποφασίσει να πληκτρολογήσει.
Δηλαδη άν εγω δώσω 3 και πληκτρολογήσω Ko και πατήσω ENTER έχω

-> s[0] = 'K'
s[1] = 'o'
s[2] ='\n'

και εσυ στο s[2] πας και βάζεις '\0' οκ?

Να υποθέσω το μονο λάθος υπήρχε σε σημεία του κώδικα που σχετίζονταν με το παραπάνω ? :)
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 17 Φεβ 2012, 21:10

Star_Light έγραψε:Αν σαν είσοδο δώσεις το Kostas

Toτε το len που επιστρέφεται απο την strlen(s) είναι 6

οποτε εσυ πας στο s[5] δηλαδη στο s το τελικο και βλέπεις αν ειναι '\n' .

Τον έλεγχο εσυ τον έχεις δώσει μονο που σε περίπτωση ο χρήστης δώσει
μήκος μεγαλύτερο απο αυτο που τελικά θα αποφασίσει να πληκτρολογήσει.
Δηλαδη άν εγω δώσω 3 και πληκτρολογήσω Ko και πατήσω ENTER έχω

-> s[0] = 'K'
s[1] = 'o'
s[2] ='\n'

και εσυ στο s[2] πας και βάζεις '\0' οκ?

Οκ! Μόνο που δεν κάνω κάποιον ξεχωριστό έλεγχο για να δω πόσους χαρακτήρες μου πληκτρολόγησε. Η fgets (s, maxlen, stdin) μου εγγυάται πως δεν πρόκειται να έχει πάνω από maxlen χαρακτήρες το s (συμπεριλαμβανομένου του '\0', που το κολλάει η fgets() αυτόματα, πάντα). Έχοντας αυτή την εγγύηση, η strlen(s) μας επιστρέφει το τρέχον μήκος του s (όπου δηλαδή βρεθεί ο πρώτος '\0' μέσα στο s, χωρίς να τον μετράει κι αυτόν).

Η μόνη περίπτωση που η fgets() ΔΕΝ θα έχει βάλει '\n' πριν από το πρώτο '\0' του s είναι αν μας έχει πληκτρολογήσει περισσότερους από maxlen χαρακτήρες στην stdin. Το αν το πρώτο '\0' του s έχει μπει πριν η ακριβώς πάνω στη θέση (maxlen-1) μας είναι αδιάφορο. Δηλαδή με άλλα λόγια, το αν το τρέχον μήκος του s συμπίπτει με το μέγιστο μήκος του μας είναι αδιάφορο. Εμείς κοιτάμε απευθείας τον τελευταίο μη μηδενικό χαρακτήρα του s, κι αν είναι '\n' το αντικαθιστάμε με '\0'... (παρένθεση, σε αυτή την περίπτωση το τρέχον μήκος του s μειώνεται κατά 1, αφού του "φάγαμε" τον χαρακτήρα '\n').

έγραψε:Να υποθέσω το μονο λάθος υπήρχε σε σημεία του κώδικα που σχετίζονταν με το παραπάνω ? :)

Όχι, είχες λάθη στις αρχικοποιήσεις, χρησιμοποιούσες για είσοδο την scanf() (που έχουμε πει πως δεν πρέπει) δεν ήλεγχες για το αν απέτυχε η callloc()... και δεν θυμάμαι τι άλλο.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 17 Φεβ 2012, 21:13

migf1 έγραψε:
...
Όχι, είχες λάθη στις αρχικοποιήσεις, χρησιμοποιούσες για είσοδο την scanf() (που έχουμε πει πως δεν πρέπει) δεν ήλεγχες για το αν απέτυχε η callloc()... και δεν θυμάμαι τι άλλο.

Δεν έλεγχες και για αρνητικό ή μηδενικό maxlen στην είσοδο.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Star_Light » 17 Φεβ 2012, 21:16

Oχι δεν εννοω στον κωδικα που εδωσα πριν καμια ωρα και ειχε λαθη... εννοω στα σχολια που εδωσα του δικου σου κωδικα... τα λαθη που ειχα σε καποια σημεια σχετιζονταν με αυτο το παράδειγμα με το Kos που σου εδωσα .

Ναι προφανως και εννοεις πως και 10 χαρακτηρες να δωσει ο χρηστης δεν σε νοιαζει αν δώσει Kos μιας και μετα θα πληκτρολογησει '\n'
οποτε θα το δει αυτο η if και θα τερματίσει εκει το string. Με την θέση των αλλων χαρακτήρων που δεσμεύτηκαν ομως αλλα δεν δοθηκαν ποτε
τι ακριβως γινεται? σε αυτη την περιπτωση??? memory leak? :lol: :lol:
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 17 Φεβ 2012, 21:23

Star_Light έγραψε:
...Με την θέση των αλλων χαρακτήρων που δεσμεύτηκαν ομως αλλα δεν δοθηκαν ποτε
τι ακριβως γινεται? σε αυτη την περιπτωση??? memory leak? :lol: :lol:

Τίποτε δεν γίνεται, απλώς παραμένουν αχρησιμοποίητοι και μπορείς π.χ. να τους γεμίσεις αργότερα. Όταν θα κάνεις free() το s θα απελευθερωθεί όλος ο χώρος που είχες δεσμεύσει με την calloc() ... δηλαδή θα απελευθερωθούν όλα τα maxlen * sizeof(char) bytes που είχαν δεσμευτεί.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Star_Light » 17 Φεβ 2012, 23:14

Κώδικας: Επιλογή όλων

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSLEN (80+1)
void Display_reverse(char *s);

int main()
{

char *s = NULL;
int maxlen;
char input[MAXSLEN]={'\0'};

printf(" Give the len : ");
fgets(input , MAXSLEN , stdin);
maxlen = atoi(input);

s= calloc( maxlen , sizeof(char));

printf(" Give a string : ");
fgets( s , maxlen , stdin);


if( s == NULL)
puts("Calloc failed");

Display_reverse(s);

printf("%s" , s);

free(s);

return 0;
}
//----------------------------------------------------------------------
void Display_reverse(char *s)
{
char *cp;

for(cp = s; *cp!='\0' && *cp!='\n'; cp++)

putchar(*cp);

puts("\n");

return;
}


Ειναι λιγο περιττή εδω η Display_reverse ή ειναι η ιδέα μου? :D
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι