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

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

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

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

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

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

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

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

βασικα να ρωτησω και κατι που τωρα το ξαναθυμηθηκα αν και πρεπει να το ειχαμε πει το καλοκαιρι... ρε συ εδω ->

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


char *cp;

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

putchar(*cp);


Αν ο χρήστης δώσει πχ Geo σαν string και μετα το Geo πατήσει ENTER ο χαρακτήρας '\n' δεν συμπεριλαμβάνεται καθολου στο τρεχον μηκος του string ετσι? πχ θα ειναι 'G' , 'e' , 'o' , '\0' . Oχι 'G' , 'e' , 'o' , '\n' .

Btw το βρήκα πάντως αυτο με την while και τους 2 πίνακες ;)

Κώδικας: Επιλογή όλων
while( s1[i] || s2[i] != '\0' )


εδώ ο λογικός τελεστής || ειναι ψευδής στην περίπτωση που μονο αν ΚΑΙ οι 2 ειναι ψευδείς. Επομένως δεν αρκεί να φτάσει μονο η μια συμβολοσειρά στον χαρακτήρα τερματισμού (είτε ειναι η πιο κοντή ειτε η πιο μακρυά) πρέπει να φτάσει και η άλλη για να τελειώσει το πανηγύρι :lol: :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, 13:26

Star_Light έγραψε:βασικα να ρωτησω και κατι που τωρα το ξαναθυμηθηκα αν και πρεπει να το ειχαμε πει το καλοκαιρι... ρε συ εδω ->
Spoiler: show
Κώδικας: Επιλογή όλων


char *cp;

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

putchar(*cp);

Αν ο χρήστης δώσει πχ Geo σαν string και μετα το Geo πατήσει ENTER ο χαρακτήρας '\n' δεν συμπεριλαμβάνεται καθολου στο τρεχον μηκος του string ετσι? πχ θα ειναι 'G' , 'e' , 'o' , '\0' . Oχι 'G' , 'e' , 'o' , '\n' .

Ο συγκεκριμένος κώδικας δεν διαβάζει καν χαρακτήρες, οπότε του είναι αδιάφορο τι θα δώσει ο χρήστης. Αυτό που κάνει αυτός ο κώδικας είναι να διατρέχει ένα υπάρχον c-string και να τυπώνει τους χαρακτήρες του, μέχρι να βρει είτε '\0' είτε '\n', τα οποία και δεν τυπώνει.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

Star_Light έγραψε:
Κώδικας: Επιλογή όλων
while( s1[i] || s2[i] != '\0' )


εδώ ο λογικός τελεστής || ειναι ψευδής στην περίπτωση που μονο αν ΚΑΙ οι 2 ειναι ψευδείς.
...

Εγώ το κάνω αλλιώς στο μυαλό μου, μεταφράζω τον κώδικα σε ανθρώπινη γλώσσα, δηλαδή...

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

while( s1[i] || s2[i] != '\0' )

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

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

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

migf1 έγραψε:]
Ο συγκεκριμένος κώδικας δεν διαβάζει καν χαρακτήρες, οπότε του είναι αδιάφορο τι θα δώσει ο χρήστης. Αυτό που κάνει αυτός ο κώδικας είναι να διατρέχει ένα υπάρχον c-string και να τυπώνει τους χαρακτήρες του, μέχρι να βρει είτε '\0' είτε '\n', τα οποία και δεν τυπώνει.


Σωστός. Το '\n' το συμπεριλαμβάνει εφόσον στην κύρια main καλούμε την fgets που το βάζει ουτως η άλλως και αυτο δημιουργει τα προβλήματα.
Η fgets διαβάζει την είσοδο του χρήστη και με αυτη την συνάρτηση (με αυτο το loop που θα μπει στην συνάρτηση) σταματάς ακριβώς εκει που θα βρει '\n' ή το τελος του C-string και το εκτυπώνει οπως ειναι (χωρις φυσικα το '\n'). Απλα ειδα κατι σημειώσεις απο το καλοκαιρι που το λεγαμε αυτο και ηθελα να το ξεδιαλύνω ;)

Μπορω να την κάνω αυτη τη συνάρτηση βιβλιοθήκη για να τελειώνουμε? Με αυτο τον πονοκέφαλο?
Γνώσεις ⇛ 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

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

To ξερω οτι έχεις φτιάξει δικιες σου βιβλιοθήκες για αυτα βεβαια :P
Γνώσεις ⇛ 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

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

Λοιπον προσεξε να δεις τι μπορουμε να κάνουμε ! Μπορούμε σε αυτον εδω τον κωδικα :

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


#include<stdio.h>
#include<stdlib.h>
#define N 10
void Display_reverse(char str[N]);
int main()
{
char str[N]="";

printf("Give a string: \n");
fgets(str,N,stdin);

printf("\n");
Display_reverse(str);

return 0;
}
//----------------------------------------------------------------------

void Display_reverse(char str[N])
{
char *cp;

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

putchar(*cp);

puts("\n");

while(cp!=str)
{
cp--;
printf("%c",*cp);
}

printf("%s" , str );
return;
}

//----------------------------------------------------------------------


Καταρχην θα βγάλω εγω το reverse operation που κανει η while.... Και θα δεσμεύουμε δυναμικά το string που δινει ο χρήστης
και μετα με μια realloc θα τον ρωταμε αν θελει έξτρα χώρο για αυτο ε? αν δεν θελει θα μενει ως εχει.... και ουσιαστικα θα διαβαζει
μεχρι '\n' && '\0' και μπορουμε να την κανουμε και βιβλιοθηκη οπως ειπα και πιο πανω :D

Βασικα εσυ αυτα μπορεις να τα κανεις σε λιγοτερο απο 1 λεπτο... απλα συνδυαζει και την ασκησουλα που έβαλες χθες ;)
Γνώσεις ⇛ 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, 15:59

Star_Light έγραψε:To ξερω οτι έχεις φτιάξει δικιες σου βιβλιοθήκες για αυτα βεβαια :P

Οπότε χρησιμοποίησέ τες...

Μια είναι η libs. Η συνάρτηση που ψάχνεις είναι η char * s_getsflushed( char *s, const size_t ssize ) ( ή η char * s_gets( char *s, const int len ) αν δεν σε ενδιαφέρει να γίνεται flushed η κύρια είσοδος από σκουπίδια μετά από κάθε διάβασμα).

Εναλλακτικά μπορείς να χρησιμοποιήσεις τη συνάρτηση int prompt_for_string( const char *prompt, char *str, const int maxlen ); από την βιβλιοθήκη prompt_for.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

Star_Light έγραψε:... απλα συνδυαζει και την ασκησουλα που έβαλες χθες ;)

Για ποιο λόγο να συνδυάσεις 2 πράγματα όταν δεν ξέρεις αν είσαι σε θέση να τα υλοποιήσεις ξεχωριστά; (τι μανία είναι αυτή να περιπλέκεις τα πράγματα; )

ΥΓ. Btw, η fgets() δεν κρατάει πάντα το '\n' στο τέλος του string που διαβάζει, αν το πλήθος χαρακτήρων που διαβάζει ξεπερνάει το μέγιστο πλήθος που της έχει περαστεί ως 2ο όρισμα, τότε δεν κρατάει τον '\n'.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

migf1 εφοσον ο κώδικας που έχω δουλεύει τοτε το μονο λαθος που θα γινει αν γινει θα ειναι στο σημειο
με την calloc αρα θα κοιτάζω μονο αυτα για να το βρω... και οχι ολο τον κωδικα απο την αρχη

+ οτι θα το δω πλαισιωμενο κατα καποιο τροπο... δεν ξερω εγω ιδεες ριχνω .
Γνώσεις ⇛ 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
Εκτύπωση

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

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