Δημοσιεύτηκε: 03 Μαρ 2012, 15:50
από migf1
Ilias95 έγραψε:
migf1 έγραψε:Παρεμπιπτόντως, ωραία η άσκηση 6 :)

Να μια λύση:
Spoiler: show
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <ctype.h>

int main(void)
{
int i = 0, x;
char characters[251+1], ch;

printf("Enter message: ");
while ((ch = getchar()) != '\n')
characters[i++] = ch;

printf("In B1FF-speak: ");
for (x = 0; x < i; x++) {
ch = toupper(characters[x]);
switch (ch) {
case 'A': putchar('4'); break;
case 'B': putchar('8'); break;
case 'E': putchar('3'); break;
case 'I': putchar('1'); break;
case 'O': putchar('0'); break;
case 'S': putchar('5'); break;
default: putchar(ch); break;
}
}
printf("!!!!!!!!!!");

return 0;
}


Ωραίος! Να και μια πιο συνεπτυγμένη εκδοχή του ίδιου κώδικα...
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <ctype.h>

#define MAXINPUT (255+1)

int main(void)
{
int i = 0;
char msg[MAXINPUT] = {'\0'};

for (i=0; '\n' != (msg[i] = toupper(getchar())); i++ )
switch (msg[i]) {
case 'A': putchar('4'); break;
case 'B': putchar('8'); break;
case 'E': putchar('3'); break;
case 'I': putchar('1'); break;
case 'O': putchar('0'); break;
case 'S': putchar('5'); break;
default: putchar(msg[i]); break;
}
puts("!!!!!!!!!!");
return 0;
}

Βέβαια δεν ξέρω αν εννοεί αυτό ακριβώς η άσκηση (ίσως π.χ. να εννοεί να μπουν τα θαυμαστικά μέσα στον πίνακα, δεν το ξεκαθαρίζει).

έγραψε:
migf1 έγραψε:Τώρα που το ξανασκέφτομαι, αν θέλεις να χρησιμοποιήσει VLA, μπορείς να ρωτάς τον χρήστη ποιο είναι το μέγιστο μέγεθος για το string ;)

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

Yeap :) Σε πραγματικό πρόγραμμα θα χρειαζόταν αυτός ο έλεγχος έτσι κι αλλιώς (με τη συγκεκριμένη υλοποίηση, γιατί με δυναμική μνήμη απλώς θα δεσμεύσαμε συνεχώς όση νέα μνήμη χρειαζόμασταν όσο μας πληκτρολογούσε ;) )

έγραψε:Τα αρνητικά του να δηλώσουμε κατευθείαν ένα μεγάλο μέγεθος (251+1 πχ) ποια είναι; Θα "σπαταληθεί" περισσότερη μνήμη;

Ναι! Βέβαια στην προκειμένη περίπτωση μιλάμε για 252 bytes (στις περισσότερες πλατφόρμες το sizeof(char) είναι 1 byte). Επίσης, οι φλοιοί έχουν μέγιστο πλήθος χαρακτήρων που σε αφήνουν να πληκτρολογήσεις στη γραμμή εντολών (στα Windows είναι 256, στον bash δεν ξέρω)... δεν θυμάμαι μήπως υπάρχει κάποιο predefined #define στα στάνταρ header files που να το έχει (πρέπει να υπάρχει σε κάνα stdio.h, αλλά δεν θυμάμαι... για filenames υπάρχει ένα, FILENAME_MAX ή κάπως έτσι).