Δημοσιεύτηκε: 03 Μαρ 2012, 16:51
από migf1
Βασικά αυτά υλοποιούνται με strings, τα οποία είναι ειδικοί πίνακες χαρακτήρων. Ειδικοί επειδή πρέπει υποχρεωτικό ο πρώτος μη ωφέλιμος χαρακτήρας τους νε είναι πάντα μηδενικός ('\0') καθώς επίσης να υπάρχει τουλάχιστον ένας μηδενικός χαρακτήρας μέσα στο string (ο μηδενικός χαρακτήρας σηματοδοτεί το τέλος των ωφέλιμων χαρακτήρων του).

Αυτό βολεύει π.χ. στο να ξεκινάς από την αρχή ενός string και να βρίσκεις το τέλος των ωφέλιμων χαρακτήρων του, χωρίς να χρειάζεται να "ξέρεις" το μέγιστο μήκος με το οποίο έχουν δημιουργηθεί... σταματάς στο 1ο '\0' που θα βρεις. Αυτά στη θεωρία, γιατί στην πράξη δεν είναι καθόλου λίγες οι περιπτώσεις κακογραμμένου κώδικα που είτε ξεχνάει να εξασφαλίσει την ύπαρξη του '\0' μέσα στο string, ή το βάζει σε θέση μεγαλύτερη από την μέγιστη με την οποία έχει ορίσει για το string.

Η συντριπτική μάλιστα πλειοψηφία των στάνταρ συναρτήσεων διαχείρισης strings, στην βιβλιοθήκη string.h θεωρούν δεδομένη την ύπαρξη ενός τουλάχιστον '\0' στα strings που τους περνάμε ως ορίσματα. Αν δεν υπάρχει,, τότε συνήθως προκαλείται seg-fault (επειδή η συνάρτηση κάποια στιγμή θα επιχειρήσει να κάνει access θέση μεγαλύτερη από την μέγιστη που έχει οριστεί το string.

Για αυτό και τα strings από χαρακτήρες που περιέχουν τουλάχιστον έναν μηδενικό χαρακτήρα θα τα συναντήσεις και με την ονομασία c-string.

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

#define MAXINPUT (255+1)
#define NORMAL "ABEIOS"
#define BIFFED "483105"

/* ------------------------------------------------------------------- */
char toBiff( const char c )
{
for (int i=0; NORMAL[i]; i++ )
if ( c == NORMAL[i] )
return BIFFED[i];
return c;
}
/* ------------------------------------------------------------------- */
int main( void )
{
int i;
char msg[MAXINPUT] = {'\0'};

printf( "Message: ");
for (i=0; i < MAXINPUT-1 && '\n' != (msg[i] = getchar()); i++ )
msg[i] = toBiff( toupper(msg[i]) );

if ( msg[i] == '\n' )
msg[i] = '\0';

printf("BIFFED : %s!!!!!!!!!!\n", msg );

return 0;
}