53
Προγραμματισμός I ΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας 1 Σπύρος Λάλης [email protected] Προγραμματισμός Ι (HY120) πίνακες και αλφαριθμητικά (strings) #7

Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης [email protected] int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

1 Σπύρος Λάλης[email protected]

Προγραμματισμός Ι (HY120)

πίνακες και αλφαριθμητικά (strings)#7

Page 2: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

2 Σπύρος Λάλης[email protected]

Πίνακες

• Ο πίνακας είναι μια ειδική δομή για την αποθήκευση μιας σειράς από στοιχεία/δεδομένα του ίδιου τύπου

• Η δήλωση ενός πίνακα γίνεται όπως για μια κανονική μεταβλητή, σε συνδυασμό με τον τελεστή [] μέσω

του οποίου δηλώνεται το μέγεθος του πίνακα

• μέγεθος Ν => ο πίνακας έχει Ν στοιχεία

• Κάθε στοιχείο ενός πίνακα από Τ είναι συντακτικά συμβατό με μια μεταβλητή τύπου Τ

• Όπως μια συμβατική μεταβλητή, κάθε στοιχείο του πίνακα πρέπει να αρχικοποιηθεί με συγκεκριμένη τιμή

Page 3: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

3 Σπύρος Λάλης[email protected]

Δέσμευση μνήμης

• Ο αριθμός των στοιχείων ενός πίνακα δίνεται (άμεσα ή έμμεσα) κατά την δήλωση του

• Το μέγεθος του πίνακα πρέπει να δηλωθεί την ώρα που γράφεται ο κώδικας

• δεν υποστηρίζονται «ανοιχτοί» πίνακες, το μέγεθος των οποίων μπορεί να (επανα)προσδιοριστεί ή/και να αλλάξει κατά την διάρκεια της εκτέλεσης

• Μνήμη πίνακα μεγέθους Ν με στοιχεία τύπου Τ

• Ν*sizeof(T)

• δεσμεύεται μονομιάς …

• … ανεξάρτητα με το ποια στοιχεία του πίνακα θα χρησιμοποιηθούν τελικά από το πρόγραμμα

Page 4: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

4 Σπύρος Λάλης[email protected]

Προσπέλαση

• Αν ο πίνακας έχει μέγεθος Ν (αντικείμενα), τότε η θέση 0 αντιστοιχεί στο πρώτο στοιχείοκαι η θέση Ν-1 στο τελευταίο στοιχείο του πίνακα

• Η μνήμη των στοιχείων του πίνακα δεσμεύεται (από τον μεταφραστή) συνεχόμενα

• η τιμή του στοιχείου στη θέση i αποθηκεύεται στην αμέσως επόμενη διεύθυνση από αυτή του στοιχείου i-1

• Η προσπέλαση θέσεων εκτός ορίων του πίνακα αποτελεί (κλασικό) προγραμματιστικό λάθος

• πρόσβαση μνήμης που δεν ανήκει στον πίνακα

• Ο μεταφραστής δεν ελέγχει αν η θέση που δίνει ο προγραμματιστής είναι εντός των ορίων

Page 5: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

5 Σπύρος Λάλης[email protected]

int a[5];

a[0] a[1] a[2] a[3] a[4]

τελεστής []

μέγεθος πίνακα

2ο στοιχείο1ο στοιχείο 5ο στοιχείο

5 * sizeof(int)

θέσεις μνήμης που δεν ανήκουν στον πίνακα

Page 6: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

6 Σπύρος Λάλης[email protected]

int a; /* ακέραιος */

int b[3]; /* πίνακας 3 ακεραίων */

int c[] = {5,8,2}; /* πίνακας 3 ακεραίων,

με αρχικές τιμές 5, 8, 2 */

a = b[0]; /* a γίνεται ? */

a = c[2]; /* a γίνεται 2 */

b[0] = c[1]; /* b[0] γίνεται 8 */

c[0]++; /* c[0] γίνεται 6 */

b[--a] = 3; /* a γίνεται 1, b[1] γίνεται 3 */

a = c[-1]; /* λάθος/άκυρη πρόσβαση! */

b[3] = 5; /* λάθος/άκυρη πρόσβαση! */

Page 7: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

7 Σπύρος Λάλης[email protected]

Ασφάλεια προσπέλασης μνήμης

• Όσο χρησιμοποιούμε απλές μεταβλητές, είναι αδύνατο να προσπελάσουμε άκυρες θέσεις μνήμης

• Αυτό δεν ισχύει όταν χρησιμοποιούμε πίνακες

• Η πρόσβαση σε θέση που βρίσκεται εκτός των ορίων του πίνακα δεν εντοπίζεται από τον μεταφραστή…

• … ούτε (απαραίτητα) κατά την εκτέλεση

• Υπάρχει περίπτωση το πρόγραμμα να «καταστρέψει» δεδομένα που αντιστοιχούν σε άλλες μεταβλητές (καθολικές ή τοπικές – δηλαδή στην στοίβα)

• μπορεί να προκληθεί εντελώς απροσδόκητη συμπεριφορά του προγράμματος ή/και παράλογα αποτελέσματα

Page 8: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

8 Σπύρος Λάλης[email protected]

00 11 10 10

00 11 10 10

10 00 00 01

1

2

3

4

5

διεύθυνση περιεχόμενα

00 01 01 11

00 10 10 10

10 01 01 01

10 10 00 00

6

................

00 10 01 00

7

00 01 01 01

8

9

char a;

char b[3];

char c;

a

b[0]

b[1]

b[2]

c

Page 9: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

9 Σπύρος Λάλης[email protected]

10 11 01 01

διεύθυνση περιεχόμενα

00 00 00 00

00 00 00 00

char a;

char b[3];

char c;

b[0]='a';

a

b[0]

b[1]

b[2]

10 11 01 01

................

10 11 01 01

10 11 01 01

10 01 00 11

c

10 01 00 10

10 01 00 10

1

2

3

4

5

6

7

8

9

Page 10: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

10 Σπύρος Λάλης[email protected]

10 11 01 01

διεύθυνση περιεχόμενα

00 00 00 00

char a;

char b[3];

char c;

b[0]='a';

b[1]='b';

a

b[0]

b[1]

b[2]

10 11 01 01

................

10 11 01 01

10 11 01 01

10 01 00 11

c

10 01 00 10

10 01 00 10

10 01 00 01

1

2

3

4

5

6

7

8

9

Page 11: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

11 Σπύρος Λάλης[email protected]

10 11 01 01

διεύθυνση περιεχόμενα

char a;

char b[3];

char c;

b[0]='a';

b[1]='b';

b[2]='c';

a

b[0]

b[1]

b[2]

10 11 01 01

................

10 11 01 01

10 11 01 01

10 01 00 11

c

10 01 00 10

10 01 00 10

10 01 00 01

10 01 00 11

1

2

3

4

5

6

7

8

9

Page 12: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

12 Σπύρος Λάλης[email protected]

10 11 01 01

διεύθυνση περιεχόμενα

char a;

char b[3];

char c;

b[0]='a';

b[1]='b';

b[2]='c';

b[-1]='d';

a

b[0]

b[1]

b[2]

10 11 01 01

................

10 11 01 01

10 11 01 01

10 01 00 11

c

10 01 10 00

10 01 00 10

10 01 00 01

10 01 00 11

1

2

3

4

5

6

7

8

9

Page 13: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

13 Σπύρος Λάλης[email protected]

10 11 01 01

διεύθυνση περιεχόμενα

char a;

char b[3];

char c;

b[0]='a';

b[1]='b';

b[2]='c';

b[-1]='d';

b[3]='e';

a

b[0]

b[1]

b[2]

10 11 01 01

................

10 11 01 01

10 11 01 01

10 01 10 10

c

10 01 10 00

10 01 00 10

10 01 00 01

10 01 00 11

1

2

3

4

5

6

7

8

9

Page 14: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

14 Σπύρος Λάλης[email protected]

Παραμετροποιημένη προσπέλαση πίνακα

• Ο προσδιορισμός της θέσης των στοιχείου ενός πίνακα μπορεί να γίνει μέσω οποιασδήποτεέκφρασης αποτιμάται σε ακέραια τιμή

• π.χ. την τιμή μιας μεταβλητής

• πρέπει να κυμαίνεται μέσα στα όρια του πίνακα

• Η διάσχιση ενός πίνακα μεγέθους Ν (για ανάγνωση ή

γράψιμο των επιμέρους στοιχείων του) μπορεί να γίνει εύκολα χρησιμοποιώντας μια δομή επανάληψης• χρησιμοποιούμε μια μεταβλητή μετρητή i,

που λαμβάνει τιμές από 0 μέχρι Ν-1

• στο σώμα της επανάληψης αναφερόμαστε στο «επόμενο» στοιχείο του πίνακα ως [i]

Page 15: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

15 Σπύρος Λάλης[email protected]

/* ανάγνωση 10 ακεραίων και εκτύπωση αθροίσματος */

#include <stdio.h>

#define N 10

int main(int argc, char* argv[]) {

int elem[N]; /* πίνακας Ν ακεραίων */

int sum; /* άθροισμα στοιχείων */

int i; /* μετρητής / προσπέλαση στοιχείων πίνακα */

for (i=0; i<N; i++) {

printf("enter int: ");

scanf("%d", &elem[i]);

}

sum = 0;

for (i=0; i<N; i++) {

sum = sum + elem[i];

}

printf("sum is %d\n", sum);

return(0);

}

Page 16: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

16 Σπύρος Λάλης[email protected]

/* ανάγνωση 10 ακεραίων και εκτύπωση μέγιστης τιμής */

#include <stdio.h>

#define N 10

int main(int argc, char* argv[]) {

int elem[N]; /* πίνακας Ν ακεραίων */

int maxi; /* θέση μεγαλύτερου στοιχείου */

int i; /* μετρητής / προσπέλαση στοιχείων πίνακα */

for (i=0; i<N; i++) {

printf("enter int: ");

scanf("%d", &elem[i]);

}

maxi = 0;

for (i=1; i<N; i++) {

if (elem[maxi] < elem[i]) {

maxi = i;

}

}

printf("maximum is %d\n", elem[maxi]);

return(0);

}

Page 17: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

17 Σπύρος Λάλης[email protected]

/* ανάποδη εκτύπωση εισόδου – ως 80 χαρακτήρες ή '\n' */

#include <stdio.h>

#define N 80

int main(int argc, char *argv[]) {

char buf[N]; /* πίνακας χαρακτήρων */

int i; /* προσπέλαση στοιχείων του πίνακα */

char c; /* βοηθητική μεταβλητή */

i = 0;

do {

c = getchar();

buf[i] = c;

i++;

} while ((i < N) && (c != '\n'));

i--;

while (i >= 0) {

putchar(buf[i]);i--;

}putchar('\n');

return(0);

}

Page 18: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

18 Σπύρος Λάλης[email protected]

Πίνακες πολλών διαστάσεων

• Ένας πίνακας μπορεί να δηλωθεί ως Ν-διάστατος• π.χ. για 2 διαστάσεις a[5][10]

• Η προσπέλαση στα στοιχεία του πίνακα γίνεται με αντίστοιχο τρόπο

• π.χ. a[0][0] ή a[4][9]

• Όπως και στους μονοδιάστατους πίνακες, η μνήμη δεσμεύεται συνεχόμενα για όλα τα στοιχεία

• Η αποθήκευση γίνεται «σε σειρές», δηλαδή πρώτα αποθηκεύονται τα στοιχεία ως προς την τελευταία διάσταση, μετά ως προς την προ-τελευταία κλπ.

a[N][M] ⬄ a[Ν*Μ]

a[i][j] ⬄ a[i*M + j]

Page 19: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

19 Σπύρος Λάλης[email protected]

00 00 00 00

διεύθυνση περιεχόμενα

00 00 00 00

00 00 00 00

00 00 00 00

char a[2][3];

a[0][0]

a[0][1]

a[0][2]

00 00 00 00

................

10 11 01 01

10 11 01 01

00 00 00 00

00 11 00 10

a[1][0]

a[1][1]

a[1][2]

1

2

3

4

5

6

7

8

9

Page 20: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

20 Σπύρος Λάλης[email protected]

00 00 00 00

διεύθυνση περιεχόμενα

00 00 00 00

00 00 00 00a[0][0]

a[0][1]

a[0][2]

00 00 00 00

................

10 11 01 01

10 11 01 01

00 00 00 00

00 11 00 10

a[1][0]

a[1][1]

a[1][2]

char a[2][3];

a[0][0]='a'; 10 01 00 10

1

2

3

4

5

6

7

8

9

Page 21: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

21 Σπύρος Λάλης[email protected]

00 00 00 00

διεύθυνση περιεχόμενα

00 00 00 00

10 01 00 10

10 01 00 01a[0][0]

a[0][1]

a[0][2]

00 00 00 00

................

10 11 01 01

10 11 01 01

00 00 00 00

00 11 00 10

a[1][0]

a[1][1]

a[1][2]

char a[2][3];

a[0][0]='a';

a[0][1]='b';

1

2

3

4

5

6

7

8

9

Page 22: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

22 Σπύρος Λάλης[email protected]

00 00 00 00

διεύθυνση περιεχόμενα

10 01 00 10

10 01 00 01a[0][0]

a[0][1]

a[0][2]

00 00 00 00

................

10 11 01 01

10 11 01 01

00 00 00 00

00 11 00 10

a[1][0]

a[1][1]

a[1][2]

char a[2][3];

a[0][0]='a';

a[0][1]='b';

a[0][2]='c';

10 01 00 11

1

2

3

4

5

6

7

8

9

Page 23: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

23 Σπύρος Λάλης[email protected]

00 00 00 00

διεύθυνση περιεχόμενα

10 01 00 11

10 01 00 10

10 01 00 01a[0][0]

a[0][1]

a[0][2]

00 00 00 00

................

10 11 01 01

10 11 01 01

00 11 00 10

a[1][0]

a[1][1]

a[1][2]

char a[2][3];

a[0][0]='a';

a[0][1]='b';

a[0][2]='c';

a[1][0]='d';

10 01 10 00

1

2

3

4

5

6

7

8

9

Page 24: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

24 Σπύρος Λάλης[email protected]

διεύθυνση περιεχόμενα

10 01 00 11

10 01 00 10

10 01 00 01a[0][0]

a[0][1]

a[0][2]

00 00 00 00

................

10 11 01 01

10 11 01 01

10 01 10 00

00 11 00 10

a[1][0]

a[1][1]

a[1][2]

char a[2][3];

a[0][0]='a';

a[0][1]='b';

a[0][2]='c';

a[1][0]='d';

a[1][1]='e';

10 01 10 10

1

2

3

4

5

6

7

8

9

Page 25: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

25 Σπύρος Λάλης[email protected]

10 01 10 10

διεύθυνση περιεχόμενα

10 01 00 11

10 01 00 10

10 01 00 01a[0][0]

a[0][1]

a[0][2]

10 01 10 01

................

10 11 01 01

10 11 01 01

10 01 10 00

00 11 00 10

a[1][0]

a[1][1]

a[1][2]

char a[2][3];

a[0][0]='a';

a[0][1]='b';

a[0][2]='c';

a[1][0]='d';

a[1][1]='e';

a[1][2]='f';

1

2

3

4

5

6

7

8

9

Page 26: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

26 Σπύρος Λάλης[email protected]

00 00 00 00

διεύθυνση περιεχόμενα

00 00 00 00

00 00 00 00

00 00 00 00

char a[2*3];

a[0*3+0]

a[0*3+1]

a[0*3+2]

00 00 00 00

................

10 11 01 01

10 11 01 01

00 00 00 00

00 11 00 10

a[1*3+0]

a[1*3+1]

a[1*3+2]

1

2

3

4

5

6

7

8

9

Page 27: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

27 Σπύρος Λάλης[email protected]

00 00 00 00

διεύθυνση περιεχόμενα

00 00 00 00

00 00 00 00

00 00 00 00

................

10 11 01 01

10 11 01 01

00 00 00 00

00 11 00 10

char a[2*3];

a[0]='a'; 10 01 00 10

a[0*3+0]

a[0*3+1]

a[0*3+2]

a[1*3+0]

a[1*3+1]

a[1*3+2]

1

2

3

4

5

6

7

8

9

Page 28: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

28 Σπύρος Λάλης[email protected]

00 00 00 00

περιεχόμενα

00 00 00 00

10 01 00 10

10 01 00 01

00 00 00 00

................

10 11 01 01

10 11 01 01

00 00 00 00

00 11 00 10

char a[2*3];

a[0]='a';

a[1]='b';

a[0*3+0]

a[0*3+1]

a[0*3+2]

a[1*3+0]

a[1*3+1]

a[1*3+2]

1

2

3

4

5

6

7

8

9

διεύθυνση

Page 29: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

29 Σπύρος Λάλης[email protected]

00 00 00 00

περιεχόμενα

10 01 00 10

10 01 00 01

00 00 00 00

................

10 11 01 01

10 11 01 01

00 00 00 00

00 11 00 10

char a[2*3];

a[0]='a';

a[1]='b';

a[2]='c';

10 01 00 11

a[0*3+0]

a[0*3+1]

a[0*3+2]

a[1*3+0]

a[1*3+1]

a[1*3+2]

1

2

3

4

5

6

7

8

9

διεύθυνση

Page 30: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

30 Σπύρος Λάλης[email protected]

00 00 00 00

διεύθυνση περιεχόμενα

10 01 00 11

10 01 00 10

10 01 00 01

00 00 00 00

................

10 11 01 01

10 11 01 01

00 11 00 10

char a[2*3];

a[0]='a';

a[1]='b';

a[2]='c';

a[3]='d';

10 01 10 00

a[0*3+0]

a[0*3+1]

a[0*3+2]

a[1*3+0]

a[1*3+1]

a[1*3+2]

1

2

3

4

5

6

7

8

9

Page 31: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

31 Σπύρος Λάλης[email protected]

διεύθυνση περιεχόμενα

10 01 00 11

10 01 00 10

10 01 00 01

00 00 00 00

................

10 11 01 01

10 11 01 01

10 01 10 00

00 11 00 10

char a[2*3];

a[0]='a';

a[1]='b';

a[2]='c';

a[3]='d';

a[4]='e';

10 01 10 10

a[0*3+0]

a[0*3+1]

a[0*3+2]

a[1*3+0]

a[1*3+1]

a[1*3+2]

1

2

3

4

5

6

7

8

9

Page 32: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

32 Σπύρος Λάλης[email protected]

10 01 10 10

διεύθυνση περιεχόμενα

10 01 00 11

10 01 00 10

10 01 00 01

10 01 10 01

................

10 11 01 01

10 11 01 01

10 01 10 00

00 11 00 10

char a[2*3];

a[0]='a';

a[1]='b';

a[2]='c';

a[3]='d';

a[4]='e';

a[5]='f';

a[0*3+0]

a[0*3+1]

a[0*3+2]

a[1*3+0]

a[1*3+1]

a[1*3+2]

1

2

3

4

5

6

7

8

9

Page 33: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

33 Σπύρος Λάλης[email protected]

Πρόσθεση πινάκων

• Αθροίζουμε στοιχείο προς στοιχείο

c[i][j] = a[i][j] + b[i][j]

• Τα i και j κυμαίνονται από την αρχή έως το τέλος

της κάθετης και οριζόντιας διάστασης των πινάκων

1 2 3

0 -5 1

3 1 7

1 3 -4

2 5 0

4 5 -2

2 5 -1

2 0 1

7 6 5

+ =

a b c

Page 34: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

34 Σπύρος Λάλης[email protected]

/* πρόσθεση πινάκων */

#include <stdio.h>

#define N 3

int main(int argc, char *argv[]) {

int a[N][N] = {{1,2,3},{0,-5,1},{3,1,7}};

int b[N][N] = {{1,3,-4},{2,5,0},{4,5,-2}};

int c[N][N]; /* αποθήκευση αποτελέσματος */

int i,j; /* προσπέλαση στοιχείων */

for (i=0; i<N; i++)

for (j=0; j<N; j++)

c[i][j] = a[i][j] + b[i][j];

for (i=0; i<N; i++) {

for (j=0; j<N; j++) {

printf("%3d ", c[i][j]);

}

printf("\n");

}

return(0);

}

Page 35: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

35 Σπύρος Λάλης[email protected]

Πολλαπλασιασμός πινάκων

• Το εσωτερικό γινόμενο ανάμεσα στην εκάστοτε σειρά a[i][] και στήλη b[][j]

c[i][j] = Σ a[i][k] * b[k][j]

• Το k κυμαίνεται από την αρχή έως το τέλος της

διάστασης πολλαπλασιασμού των πινάκων

• πλάτος πρώτου πίνακα = ύψος δεύτερου πίνακα

1 2 3

0 -5 1

3 1 7

1 3 -4

2 5 0

4 5 -2

17 28 -10

-6 -20 -2

33 49 -26

* =

a b c

Page 36: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

36 Σπύρος Λάλης[email protected]

/* πολλαπλασιασμός πινάκων */

#include <stdio.h>#define N 3

int main(int argc, char *argv[]) {int a[N][N] = {{1,2,3},{0,-5,1},{3,1,7}};int b[N][N] = {{1,3,-4},{2,5,0},{4,5,-2}};int c[N][N]; /* αποθήκευση αποτελέσματος */int i,j,k; /* προσπέλαση στοιχείων */

for (i=0; i<N; i++)for (j=0; j<N; j++) {c[i][j] = 0;for (k=0; k<N; k++) {c[i][j] = c[i][j] + a[i][k] * b[k][j];

}}

for (i=0; i<N; i++) {for (j=0; j<N; j++) {printf("%3d ", c[i][j]);

}printf("\n");

}

return(0);}

Page 37: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

39 Σπύρος Λάλης[email protected]

Αρχικοποίηση πινάκων

• Υποστηρίζεται αρχικοποίηση κατά την δήλωση • char c[4]={'a','b','c','d'};

• Αν η διάσταση αφεθεί απροσδιόριστη, ορίζεται εμμέσως από τον αριθμό των αρχικών τιμών• char c[]={'a','b','c','d'};

• Αν η διάσταση προσδιοριστεί ρητά αλλά δοθούν λιγότερες αρχικές τιμές, οι υπόλοιπες είναι 0

• char c[4]={'a','b'}; /* c[2],c[3] είναι '\0' */

• Αν αντί για τιμές μεμονωμένων στοιχείων δοθεί απλά η (ειδική) τιμή 0 ή '\0', όλα τα στοιχεία γίνονται 0

• char c[4]={0}; /* όλα τα στοιχεία '\0' */

• char c[4]={'\0'}; /* όλα τα στοιχεία '\0' */

• Προσοχή με τους πολυδιάστατους πίνακες …

Page 38: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

40 Σπύρος Λάλης[email protected]

strings

Page 39: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

41 Σπύρος Λάλης[email protected]

Συμβολοσειρές (strings)

• Τα strings υλοποιούνται ως πίνακες από char

• Τουλάχιστον ένα στοιχείο έχει την τιμή '\0' (0)

• Το πρώτο στοιχείο με αυτή την τιμή καθορίζει το τέλος του string – ονομάζεται τερματικό

• το τερματικό δεν βρίσκεται αναγκαστικά στο τελευταίο στοιχείο του πίνακα χαρακτήρων

• τα στοιχεία μετά το τερματικό δεν λαμβάνονται υπόψη στις διάφορες λειτουργίες που αφορούν τα strings

• Ένα πρόγραμμα που χρησιμοποιεί strings μπορεί να υποθέσει πως αυτά τερματίζονται με '\0'

• Ένα πρόγραμμα που δημιουργεί strings πρέπει να φροντίσει αυτά να τερματίζονται με '\0'

Page 40: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

42 Σπύρος Λάλης[email protected]

char str1[] = {'w', 'i', 'n'}; /* not a string! */

char str2[] = {'w', 'i', 'n', '\0'}; /* "win" */

char str3[4] = {'w', 'i', 'n'}; /* "win" */

char str4[] = {'w', 'i', 'n', '\0', 'x'}; /* "win" */

char str5[]="win"; /* "win" */

char str6[7];

str6[0] = str1[1]; /* 'i' */

str6[1] = ' '; /* ' ' */

str6[2] = str1[0]; /* 'w' */

str6[3] = str2[1]; /* 'i' */

str6[4] = str3[2]; /* 'n' */

str6[5] = '\0'; /* '\0' */

str6[6] = 'x'; /* 'x' */

Page 41: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

43 Σπύρος Λάλης[email protected]

Ανάγνωση & εκτύπωση strings

• Μπορούμε να τα υλοποιήσουμε (εμείς) χαρακτήρα προς χαρακτήρα μέσω getchar() και putchar()

• Πιο απλά, χρησιμοποιούμε scanf() και printf()

• με προσδιοριστή %s και παράμετρο πίνακα χαρακτήρων

• στην scanf δεν βάζουμε & πριν το όνομα της μεταβλητής

• το γιατί θα το δούμε λίγο αργότερα …

• Η printf() σταματά την εκτύπωση των

περιεχομένων του πίνακα όταν βρει το τερματικό

• Η scanf() σταματά την ανάγνωση χαρακτήρων

(και την αποθήκευση τους στον πίνακα) μόνο όταν βρεθεί ένας «λευκός» χαρακτήρας

• προσοχή: μπορεί να γίνει αποθήκευση εκτός ορίων του πίνακα που δίνεται ως παράμετρος!

Page 42: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

44 Σπύρος Λάλης[email protected]

#include<stdio.h>

int main(int argc, char *argv[]) {

char str[4];

printf("enter string: ");

scanf("%s",str);

printf("you entered %s\n",str);

return(0);

}

αν ο χρήστης εισάγει συμβολοσειρά με περισσότερους από 3 χαρακτήρες, αυτοί θα αποθηκευτούν σε θέσεις μνήμης που βρίσκονται εκτός ορίων του πίνακα ...

δίνεται το όνομα της μεταβλητής(του πίνακα) χωρίς το &

προσδιοριστής string

Page 43: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

45 Σπύρος Λάλης[email protected]

#include<stdio.h>

int main(int argc, char *argv[]) {

char str[4];

printf("enter string: ");

scanf("%3s",str);

printf("you entered %s\n",str);

return(0);

}

διαβάζει το πολύ 3 χαρακτήρες (εκτός από το '\0' που θα

αποθηκευτεί ως τελευταίος χαρακτήρας της συμβολοσειράς)

Page 44: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

46 Σπύρος Λάλης[email protected]

/* μήκος string str */

#include <stdio.h>

#define N 32

int main(int argc, char *argv[]) {

int len;

char str[N];

printf("enter string: ");

scanf("%31s", str);

for (len=0; str[len]!='\0'; len++) {}

printf("length of %s is %d\n", str, len);

return(0);

}

Page 45: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

47 Σπύρος Λάλης[email protected]

/* ανάποδη αντιγραφή του str1 στο str2 */

#include <stdio.h>

#define N 32

int main(int argc, char *argv[]) {

int len, pos;

char str1[N], str2[N];

printf("enter string: ");

scanf("%31s", str1);

/* βρες το τέλος του str1 */

for (len=0; str1[len]!='\0'; len++) {}

/* αντέγραψε ανάποδα στο str2 */

for (pos=0,len--; len>=0; pos++,len--) {

str2[pos] = str1[len];

}

str2[pos] = '\0'; /* βάλε τερματικό */

printf("%s in reverse is %s\n", str1, str2);

return(0);

}

Page 46: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

48 Σπύρος Λάλης[email protected]

/* αντιγραφή του str1 "και" του str2 στο str3 */

#include <stdio.h>

#define N 32

int main(int argc, char *argv[]) {

char str1[N], str2[N], str3[2*N-1];

int i, j;

printf("enter string: ");

scanf("%31s", str1);

printf("enter string: ");

scanf("%31s", str2);

/* αντέγραψε το str1 στο str3 */

for (i=0; str1[i]!='\0'; i++)

str3[i] = str1[i];

/* αντέγραψε το str2 στο str3 */

for (j=0; str2[j]!='\0'; j++,i++)

str3[i] = str2[j];

str3[i]='\0'; /* βάλε τερματικό */

printf("%s + %s = %s\n", str1, str2, str3);

return(0);

}

Page 47: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

49 Σπύρος Λάλης[email protected]

Λίγα επιπλέον πράγματα (μόνο για όσους έχουν κατανοήσει

πλήρως όλα τα προηγούμενα)

Page 48: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

50 Σπύρος Λάλης[email protected]

Συναρτήσεις βιβλιοθηκών για strings#include <string.h>

size_t strlen(const char *s);

char *strcpy(char *dest, const char *src);

char *strcat(char *dest, const char *src);

char *strchr(const char *str, int c);

char *strstr(const char *src, const char *look);

char *strpbrk(const char *src, const char *tokens);

int strcmp(const char *s1, const char *s2);

int strncmp(const char *s1, const char *s2, size_t n);

#include <stdlib.h>

int atoi(const char *s);

double atof(const char *s);

#include <ctype.h>

int isalpha(char c);

int isupper(char c);

int islower(char c);

int isspace(char c);

int isdigit(char c);

Page 49: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

51 Σπύρος Λάλης[email protected]

Κάποιες από τις πιο βασικές συναρτήσεις

size_t strlen(const char *s);

• επιστρέφει το μήκος του s, χωρίς το τερματικό

char *strcpy(char *dest, const char *src);

• αντιγράφει τo src πάνω στο dest, με το τερματικό

• τα src και dest δεν πρέπει να έχουν επικαλυπτόμενη μνήμη

• περισσότερα σε λίγο …

int strcmp(const char *s1, const char *s2);

• συγκρίνει το s1 με το s2, χαρακτήρα προς χαρακτήρα, μέχρι

να εντοπιστεί διαφορά ή να βρεθεί το τερματικό

• επιστρέφει <0 αν s1<s2, 0 αν s1==s2, >0 αν s1>s2

Page 50: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

52 Σπύρος Λάλης[email protected]

/* σύγκριση string */

#include <stdio.h>

#include <string.h>

#define N 32

int main(int argc, char *argv[]) {

char s1[N], s2[N];

int res;

printf("enter 2 strings: ");

scanf("%31s %31s", s1, s2);

printf("%s is %d long\n", s1, strlen(s1));

printf("%s is %d long\n", s2, strlen(s2));

res = strcmp(s1,s2);

if (res < 0)

printf("%s is smaller than %s\n", s1, s2);

else if (res > 0)

printf("%s is larger than %s\n", s1, s2);

else

printf("%s is equal to %s\n", s1, s2);

return(0);

}

Page 51: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

53 Σπύρος Λάλης[email protected]

Ανάγνωση string με περιορισμό χαρακτήρων

• Όταν διαβάζουμε ένα string με scanf πρέπει πάντα

να προσδιορίζουμε μέγιστο πλήθος χαρακτήρων που επιτρέπεται να αποθηκευτούν στον αντίστοιχο πίνακα

• Ιδανικά, θέλουμε όχι μόνο το μέγεθος του πίνακα αλλά και ο μέγιστος αριθμός χαρακτήρων που διαβάζονται μέσω scanf να ορίζεται ως συμβολική σταθερά

• Όμως, μέχρι στιγμής τo δεύτερο γίνεται με το χέρι …

#define SIZE 32

char str[SIZE];

scanf("%31s",str);

αυτό θέλουμε να βγαίνει αυτόματα

Page 52: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

54 Σπύρος Λάλης[email protected]

Χρήση sprintf για αυτοματοποιημένη δημιουργία format string για την scanf

#define SIZE 32

char str[SIZE];

θέλουμε να κατασκευάσουμετο format string "%31s"

από τι αποτελείται;

το σύμβολο % ένα ακέραιο με τιμή SIZE-1 το γράμμα s

printf("%%"); printf("%d", SIZE-1); printf("s");

• Χρησιμοποιούμε την sprintf για να εκτυπώσουμε όλα

τα παραπάνω μέσα σε έναν πίνακα χαρακτήρων

• αντί για την έξοδο του προγράμματος

Page 53: Προγραμματισμός Ι (HY120) · 5 Σπύρος Λάλης lalis@uth.gr int a[5]; a[0] a[1] a[2] a[3] a[4] τελεστής [] μέγεθος πίνακα 1οστοιχείο

Προγραμματισμός IΤΗΜΜΥ, Πανεπιστήμιο Θεσσαλίας

55 Σπύρος Λάλης[email protected]

/* ασφαλής ανάγνωση string */

#include <stdio.h>

#define SIZE 32

int main(int argc, char *argv[]) {

char str[SIZE]; /* string που θα διαβαστεί */

char fstr[16]; /* format string για την scanf */

sprintf(fstr,"%%%ds", SIZE-1);

printf("scan with format string %s\n",fstr);

printf("enter string (up to %d chars): ",SIZE-1);

scanf(fstr,str);

printf("str is %s\n", str);

return(0);

}