Δημοσιεύτηκε: 29 Ιούλ 2011, 12:43
από migf1
Star_Light έγραψε:

ενα ενδεικτικο παραδειγμα οτι καταλαβα την sscanf
Spoiler: show
Κώδικας: Επιλογή όλων
#include<stdio.h>
#define N 20

int main()
{
char array[N];

printf("dwse enan xaraktira: ");
fgets( array ,20,stdin);
sscanf(array,"%c%d" ,&array[N]);
printf("%c", array[N]);
printf("\n");
printf("%d",array[N]);

return 0;
}


:D

Δυστυχώς παραβιάζεις μια από τις βασικές αρχές της sscanf (παραθέτω το σχετικό απόσπασμα από την τεκμηρίωση της συνάρτησης στον gcc 2.7)
GNU libc 2.7 έγραψε:
...
The behavior of this function is undefined if copying takes place between objects that overlap—for example, if s is also given as an argument to receive a string read under control of the ‘%s’, ‘%S’, or ‘%[’ conversion.

Γιατί χρησιμοποιείς το array και ως 1ο και ως 3ο όρισμα της sscanf (δεν έδωσα πουθενά τέτοιο παράδειγμα :p). Επίσης, τι ρόλο παίζει εκείνο το %d που έχεις κολλήσει μετά από το %c στο 2ο όρισμα;

Γενικώς διακρίνω μια τάση σου να περιπλέκεις αχρείαστα τα παραδείγματα που δίνω. Δεν έχω όμως καταλάβει αν αυτό οφείλεται στην ανήσυχη φύση σου ή στο ότι δεν καταλαβαίνεις τα παραδείγματα που δίνω (τείνω να πιστέψω το 2ο, χωρίς να είμαι φυσικά σίγουρος).

Το array σου (που στα δικά μου παραδείγματα το ονομάζω inbuf, ή buffer) πρέπει να το χρησιμοποιήσεις απλά για να διαβάσεις μέσα του την γραμμή της κύριας εισόδου (είτε με την fgets είτε με την s_get) και να το περάσεις μετά στην sscanf ως 1ο της όρισμα. Όποιες μεταβλητές θέλεις να "τραβήξεις" μέσα από το array θα πρέπει να τις έχεις δηλωμένες ξεχωριστά και να περάσεις τις διευθύνσεις τους ως 3ο (4ο, 5ο, κλπ) όρισμα της sscanf, με τα αντίστοιχα % στο 2ο όρισμα της sscanf.

έγραψε:
τωρα σχετικα με αυτα που μου ειπες.... δηλαδη αν βαλω εγω... την fgets μετα θα βαλω μονο την sscanf και καμια απο τις get_char ή s_get?????

έγραψε:
EDIT: αΚΥΡο.. την s_get την θελω ουτως η αλλως γιατι χρησιμοποιειται και στις αλλες συναρτησεις.... λοιπον κοιτα εγω το εκανα ετσι......
Spoiler: show
Κώδικας: Επιλογή όλων

int main( void )
{
/*Και εβγαλα και απο εδω το c */
int y,z;
long int l1,l2;
float f1, f2;
char buffer[BUFFER_SIZE] = "";

printf("Dwste enan xarakthra: "); /*Oι τροποποιήσεις */
-> fgets(buffer,BUFFER_SIZE,stdin);
-> sscanf(buffer,"%c", &buffer[BUFFER_SIZE]);
-> printf("dwsate ton xarakthra: %c\n",buffer[BUFFER_SIZE] );

Κάνεις το ίδιο σφάλμα, περνάς το buffer και ως 1ο και ως 3ο όρισμα στην sscanf.

Αν θες να κρατήσεις μονάχα τον 1ο χαρακτήρα του διαβασμένου buffer σε μια δική σου μεταβλητή c είτε πάρε τον απευθείας με: c = *buffer; (ή: c = buffer[0]; ) ή χρησιμοποίησε την sscanf: sscanf(buffer, "%c", &c);

Μια φιλική συμβουλή αν μου επιτρέπεις, ειδικά τώρα στην αρχή μην προσπαθείς να σκέφτεσαι "out of the box".