การเขียนโปรแกรมภาษา C


     

ตัวแปรสตริง (String)

ตัวแปร string หรือแถวตารางอาเรย์ของตัวหนังสือนั้น ภาษา C ไม่มีกลไกที่จะสนับสนุนได้โดยตรง ถ้าต้องการให้ภาษา C สามารถรองรับข้อมูลที่เป็นตัวหนังสือแล้ว จะต้องมีการเตรียมพื้นที่หน่วยความจำให่เหมาะสมหรือการใช้สตริงค่าคงที่ (strong constant) ซึ่งจะทำให้โปรแกรมภาษา C เข้าถึงข้อมูลสตริงซึ่งจะเป็นทั้งข้อมูลที่เข้ามาในโปรแกรมและเปป็นข้อมูลที่ออกจากโปรแกรมได้

โดยทั่วไปแล้วโปรแกรมภาษา C จะสนับสนุนข้อมูลที่เป็นอักษรโดยกำหนดให้อักษรแต่ละตัว ในรูปแบบตัวแปรประเภท char และข้อมูลสตริงนั้นโปรแกรมที่เขียนด้วยภาษา C จะถือว่าเป็นชุดข้อมูลตัวหนังสือที่เรียงกันตามลำดับ ขณะที่โปรแกรมที่เขียนด้วยภาษา C++ จะถือว่าสตริงเป็นตารางอาเรย์ข้อมูลประเภทตัวหนังสือ (Array of char) โดยตัวหนังสือจะอยู่ในตารางแต่ละช่อง และ ณ ตำแหน่งสิ้นสุดของตารางอาเรย์ที่เก็บตัวแปรสตริงนั้นจะมีสัญลักษณ์ “{PBODY}” (ตัวสิ้นสุดสตริง หรือ ตัว NULL) บรรจุอยู่ ดังนั้น ในการเตรียมเนื้อที่สำหรับตัวแปรสตริงที่ประกอบด้วยตัวหนังสือ n ตัวนั้นจะต้องเตรียมตารางไดนามิกขนาด n+1 ช่องเสมอ ดังตัวอย่างต่อไปนี้

1) ตัวหนังสือ ‘a’ เป็นตัวแปร char จะใช้เนื้อที่ 1 ไบต์ แต่ “a” เป็นตัวแปร string แล้ว จะต้องใช้เนื้อที่ขนาด 2 ไบต์เพื่อจุตัวอักษร ‘a’ และ ตัวสิ้นสุดสตริง ({PBODY})
2) ตัวแปรสตริงสามารถประกาศให้อยู่ในรูปตารางต่อไปนี้ได้
a. ตารางอาเรย์ตัวหนังสือ char String1[10] สามารถรองรับตัวหนังสือได้มากที่สุด 9 ตัว และ ตัวสิ้นสุดสตริง
b. ตัวแปรพอยเตอร์ตัวหนังสือ char *String2 สามารถรองนับตัวหนังสือได้ตามที่ผู้เขียนโปรแกรมได้เตรียมเนื้อที่ตารางไดนามิกส์ไว้

ถ้าต้องการทำอะไรกับตัวแปรสตริงแล้วให้เรียกใช้เฮดเดอร์ไฟล์ string.h ซึ่งเป็นไลบรารีไฟล์มาตรฐานสำหรับจัดการกับตัวแปรสตริง

เราสามารถตั้งค่าเริ่มต้นให้ตัวแปรสตริงได้ 2 วิธีหลักคือ
char S1[] = “Example”; ซึ่งภายในตัวแปรประกอบด้วย

S1 |E|x|a|m|p|l|e|{PBODY}|

ทั้งนี้เนื่องจากการเตรียมพื้นที่ขนาด 8 ช่องตาราง โดย 7 ช่องตารางแรกเก็บตัวหนังสือ และ ข้อมูลช่องสุดท้ายเก็บตัวสิ้นสุดสตริง

char S2[20] = “Another Example”; ซึ่งภายในตัวแปรประกอบด้วย
S2            |A|n|o|t|h|e|r| |E|x|a|m|p|l|e|{PBODY}||?|?|?|?|


ทั้งนี้เนื่องจากการเตรียมพื้นที่ขนาด 20 ช่องตาราง แต่ใช้จริง 16 ช่อง คือตัวหนังสือ 15 ช่องและ ช่องที่ 16 เก็บตัวสิ้นสุดสตริง

การตั้งต้นตัวแปรสตริง ดังตัวอย่างต่อไปนี้ถือว่าเป็นการตั้งต้นตัวแปรสตริงที่ถูกต้อง



ดังนั้น สิ่งที่เกี่ยวข้องสตริงสามารถสรุปออกมาได้ดังนี้
- ตัวแปรสตริงคือ ลำดับตัวหนังสือที่อยู่ภายในเครื่องหมายอัญประกาศ หรือเครื่องหมายคำพูด (“ ”) หรือ ตัวแปรสตริงคงที่ (String Constant)
- อีกทางหนึ่งตัวแปรสตริงถือว่าเป็นตัวแปรตารางอาเรย์ ของตัวหนังสือ (Array of char)
- สามารถใช้คำสั่ง printf scanf และ print ของภาษา C กับตัวแปรสตริงได้
- การประมวลเท็กซ์ คือการประมวลตัวแปรสตริง
- หน่วยข้อมูลพื้นฐานของตัวแปรสตริงคือตัวหนังสือหรือ ชุดตัวหนังสือ ไมใช่ตัวเลข
- การประยุกต์ใช้ตัวแปรสตริงนั้นคือ Word Processing หรือ Text Editor

ตัวอย่างการใช้ตัวแปรสตริงจะแสดงให้เห็นดังนี้
#include 

void main()

{

                    char first[100], last[100];

                    int i;



                    printf("\nEnter your first name:");

                    scanf("%s", first );

                    printf("\nEnter your last name:");

                    scanf("%s", last );

                    printf("\nYour full name is: %s %s\n", first, last );

                    printf("First name is: ");

                    for( i=0; (i<100 && first[i] != '{PBODY}') ; i++ ){

                       printf("%c ",first[i]);

                    }

                    printf("\nLast name is: ");

                    for( i=0; (i<100 && last[i] != '{PBODY}') ; i++ ){

                       printf("%c ",last[i]);

                    }

                    printf("\n");

}


ผลที่ได้การเขียนโปรแกรมเติมชื่อและนามสกุลจะแสดงให้เห็นในภาพที่ 7.1



การใช้งานตัวแปรสตริงนั้นมีหลักการดังนี้
- เตรียมพื้นที่ตารางอาเรย์ให้ใหญ่พอรับตัวหนังสือแทนคำและ ตัวสิ้นสุดสตริงดังต่อไปนี้

char str1[6] = “Hello”;
char str2[] = “Hello”;
char *str3 = “Hello”;
char str4[6] = {‘H’,’e’,’l’,’l’,’o’,’{PBODY}’};

ตัวแปรสตริงแต่ละตัวถือว่าเป็นตัวแปรคงที่ ดังนั้นจึง Assign ค่าแทนกันเช่นตัวอย่างต่อไปนี้ไม่ได้

Str1 = Str2; // ห้ามทำเช่นนี้กับตัวแปรสตริง เพราะมีวิธีอื่นที่ดีกว่านั้น

ตัวอย่างต่อไปนี้แสดงให้เห็น วิธี Assign ตัวแปรสตริงโดยใช้ตัวแปรพอยเตอร์ เข้าช่วย

char *S1 = “Hello”, *S2 = “Goodbye”; // ตัวแปร S1 และ S2 แก่ไขเปลี่ยนแปลงไม่ได้
char *S3;
S3 = S1; // บังคับให้ S3 ชี้ไปที่ แอดเดรสของตัวแปรพอยเตอร์ S1
S3 = S2; // บังคับให้ S3 ชี้ไปที่ แอดเดรสของตัวแปรพอยเตอร์ S2

อีกตัวอย่างในการ Assign ตัวแปรสตริงสามารถแสดงให้เห็นดังนี้
char Str[6] = “Hello”; // ตั้งต้นตัวแปร Str ด้วยคำว่า Hellow
char Str[0] = ‘Y’; char Str[4] = ‘{PBODY}’; // การแก้ไขให้ Str = “Yell”

อย่างไรก็ตาม วิธีแก้ไขเปลี่ยนแปลงข้อมูลสตริงในตารางมีเงื่อนไขว่า

- ตารางอาเรย์ที่ทำหน้าที่เป็นสตริงจะต้องปิดท้ายด้วย ‘{PBODY}’ เสมอ มิฉะนั้นตัวแปรอาเรย์ที่ทำหน้าที่เป็นสตริงจะไม่มีจุดสิ้นสุดสตริง
- สตริงที่แก้ไขต้องมีขนาดน้อยกว่าขนาดของตารางอาเรย์ที่เก็บค่าสตริง

การเปลี่ยนแปลงแก้ไขตัวแปรสตริงโดยใช้ไดนามิกอาเรย์นั้นต้องใช้ความระมัดระวังเป็นอย่างยิ่ง เพราะตารางไดนามิกส์นั้นต้องเตรียมพื้นที่ให้ ตัวสิ้นสุดสตริง (NULL) มิฉะนั้นโปรแกรมจะพิมพ์ข้อมูลสตริงออกมาผิดไปจากที่ต้องการ ดังตัวอย่างต่อไปนี้
char *s;

                    - WRONG, need to allocate 1 more spaceßs = (char *)malloc(sizeof(char) * 0); //

                    strcpy(s, "linux");

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


กรณีที่ใช้คำสั่ง strlen เพื่อหา ขนาดอาเรย์ก่อนทำ Dynamic allocation (malloc) นั้น พึงรับทราบว่า คำสั่ง strlen จะมีขนาดเพียงพอสำหรับตัวจำนวนอักษรที่ใช้ในตัวแปรสตริงเท่านั้น แต่ไม่ได้นับตัวแปร NULL ที่ใช้กำหนดจุดสิ้นสุดของสตริงด้วย โดยที่รายละเอียดเกี่ยวกับคำสั่ง strlen จะกล่าวถึงในตอนต่อไป


การกำหนดค่าให้ตัวแปรสตริง (String Assignment)


ตัวอย่างการกำหนดค่าให้ตัวแปรสตริง
char s[5]="SIIT";        // ใช้ได้, กำหนดค่าตัวแปรสตริงให้ตัวแปรอาเรย์

                    char dept[5], *d=dept;  // ใช้ได้, กำหนดค่าตัวแปรสตริงให้ตัวแปรพอยเตอร์

                    char name[20];

                    name = “C. Sinthanayothin";        // ผิด อย่ากำหนดตัวแปรสตริงให้ตัวแปรอาเรย์ด้วยวิธีนี้

                    strcpy(name,“C. Sinthanayothin");                  // ใช้ได้, ให้ก๊อปปี้ค่าสตริงโดยใช้คำสั่ง strcpy 

                    strcpy(dept,"IT");                            // ใช้ได้, ก๊อปปี้ค่าสตริง ลงในตัวแปร dept

                    printf("%s %s %s\n",d,s,dept);    // ใช้ได้, แสดงผลค่าสตริงด้ว printf

                    d = strcpy(s,"EE");                          // ใช้ได้, นี่คือการคืนค่าตัวแปรสตริง ลงใน ตัวแปร d ด้วยคำสั่ง strcpy

                    printf("%s %s %s %s\n",name,d,s,dept);



                    char c1[30], c2[30]=“This is new c1 string”;

                    char s[30] = "c programming ";

                    char str1[30];  // วิธี้ทำให้ตัวแปร str1 ไม่เป็น l-value เพราะเป็น constant array

                    char *str;   // วิธี้ทำให้ตัวแปร str เป็น l-value เพราะเป็น ตัวแปรพอยเตอร์

                    strcpy(c1, c2);                                                       // ใช้ได้, ก๊อปปี้ข้อมูลใน c2 ลงใน c1

                    str = strcat(s,"is great!!");              // ใช้ได้, คือค่าเป็น ตัวแปรพอยเตอร์ประเภท char

                    str1 = strcat(s,"is great!!");            // ผิด, ฟังก์ชัน strcat ตอ้งคืนค่าด้วยตัวแปรพอยเตอร์ประเภท char ไม่ใช่ตารางอาเรย์ประเภท char


ข้อควรจำคือ: ต้องเตรียมพื้นที่หน่วยความจำไว้ให้พร้อมก่อนการกำหนดค่าให้ตัวแปรสตริงมิฉะนั้นอักษรบางตัวก็จะแหว่งหายไป

ตัวแปรสตริงนั้นจะใช้ %s เป็นตัว place holder ขณะที่ใช้คำสั่ง sscanf ในการอ่านข้อมูลจำพวกสตริงแล้วจัดการแปลงข้อมูลให้อยู่รูปตามที่กำหนด ดังตัวอย่างต่อไปนี้
int sscanf( const char *buffer, const char *format [, argument ] ... );



char ch, int inum, float fnum;

char buffer[100] = “A10 50.0”;

sscanf(buffer,”%c%d%f”,&ch,&inum,&fnum);             /* puts ‘A’ in ch, 10 in inum and 50.0 in fnum */



sscanf("  85  96.2  hello","%d%.3lf%s",&num,&val,word);



// results: num=85, val = 96.2, word = "hello"




                    ส่วน sprintf ใช้แสดงผลลัพธ์ที่อยู่ในรูปแบบต่างๆ ให้เป็นตัวแปรสตริงดังตัวอย่างต่อไปนี้

int sprintf( char *buffer, const char *format [, argument] ... );



char buffer[100];

sprintf(buffer,”%s, %s”,LastName,FirstName);

if (strlen(buffer) > 15)

  printf(“Long name %s %s\n”,FirstName,LastName);




                    ถ้าต้องการแปลงตัวเลขให้เป็นข้อมูลสตริงให้ใช้ฟังก์ชัน sprintf และ ตัวแปรดัชนี้ char ทำตามคำสั่งต่อไปนี้



int sscanf(char *buffer, const char *format [, argument ] ... );

char S[10]; int day, month,year;

sprintf(S,”%d/%d/%d”, day, month, year);

ถ้า day = 23, month = 8, year = 2001 ผลลัพธ์คือ S = “23/8/2001”




ต่อไปนี้คือตัวอย่างการใช้ sprintf กับ sscanf เมื่อเปรียบเทียบกับ printf



#include

#include

int main()

{

                    char s[30]="85  96.2  hello";

                    int num, mon=8,day=23,year=2001;

                    double val;

                    char word[10];  // can we use: char *word;  

                                         // make sure your assign the proper address for pointer

                    sscanf("  85  96.2  hello","%d%lf%s",&num,&val,word);

                    printf("num=%d   val=%.3lf   word=%s\n",num,val,word);

                    sprintf(s,"%d/%d/%d", mon, day, year);

                    printf("s = %s\n",s);

                    return 0;

}




ข้อทบทวน: ภาษาซี มีฟังก์ชันที่ใช้ดัดแปลงแก้ไขตัวแปรสตริง หลายแบบตามความต้องการของผู้ใช้ได้แก่:



                    strlen(str) – คำนวณความยาวสตริง ซึ่งจะมีการนับไปเรื่อยๆ จนกว่าจะพบตัวแปร NULL ถึงจะหยุดโดยไม่มีการนับตัวแปร NULL ที่สิ้นสุดประโยคเข้าไปด้วย ดังตัวอย่างต่อไปนี้



                    int strlen(char *str);

char str1 = “hello”;

strlen(str1) จะคืนค่าออกเป็น 5 เพราะ มีอักษร 5 ตัว



                    strcpy(dst,src) – ก็อปปี้ข้อมูลจากตัวแปรสตริง src พร้อมตัวสิ้นสุดสตริง NULL ไปที่ตัวแปรสตริง dst แต่มีเงื่อนไขว่าตัวแปร des ต้องได้รับการเตรียมพื้นที่ให้ใหญ่พอๆกับตัวแปร src และการเตรียมพื้นที่ ให้ ตัวแปร src และ ตัวแปร dst ต้องไม่ทับซ้อนกันมิฉะนั้นจะให้ผลที่คาดเดาไม่ได้ การประกาศใช้ฟังก์ชัน strcpy จะทำได้ดังนี้



                    char *strcpy(char *dst, char *src)



strncpy(dst,src,n) – ก็อปปี้ข้อมูลจากตัวแปรสตริง src โดยไม่ก๊อปปี้ตัวสิ้นสุดสตริง NULL ไปที่ตัวแปรสตริง dst เนื่องจากมีจำนวนตัวอักษร n เป็นตัวจำกัดไว้ แต่มีเงื่อนไขว่าตัวแปร des ต้องได้รับการเตรียมพื้นที่ให้ใหญ่พอๆกับตัวแปร src และการเตรียมพื้นที่ ให้ ตัวแปร src และ ตัวแปร dst ต้องไม่ทับซ้อนกันมิฉะนั้นจะให้ผลที่คาดเดาไม่ได้ การประกาศใช้ฟังก์ชัน strncpy จะทำได้ดังนี้



char *strncpy(char *dst, char *src, int n)



                    strcmp(str1,str2) – เปรียบเทียบข้อมูลในตัวแปร str1 กับข้อมูลในตัวแปรสตริง str2 โดยใช้อักษรตัวแรกที่เริ่มต่างกันเป็นหลักซึ่งให้ผลดังนี้



น้อยกว่า 0  -- ถ้าค่า  ASCII ที่เริ่มแตกต่างใน str1 มีขนาดเล็กกว่า str2 หรือ str1 เริ่มต้นเหมือนกับ str2 แต่ str2 นั้นมีตัวอักษรมากกว่า

มากกว่า 0 -- ถ้าค่า  ASCII ที่เริ่มแตกต่างใน str1 มีขนาดใหญ่กว่า str2 หรือ str1 เริ่มต้นเหมือนกับ str2 แต่ str1 นั้นมีตัวอักษรมากกว่า

0 ถ้าตัวแปรสตริงทั้ง 2 ตัวนั้นใช้ตัวอักษรเดียวกันและความยาวเท่ากัน



การประกาศใช้ฟังก์ชัน strcmp จะทำได้ดังตัวอย่างต่อไปนี้



int strcmp(char *str1, char *str2)

#include

#include

void main()

{

                    printf("%d \n", strcmp("hello","hello")); // returns 0

                    printf("%d \n", strcmp("yello","hello")); //returns value > 0

                    printf("%d \n", strcmp("Hello","hello")); // returns value < 0

                    printf("%d \n", strcmp("hello","hello there")); // returns value < 0

                    printf("%d \n", strcmp("some diff","some dift")); //returns value<0

}


strncmp(str1,str2,n) – เปรียบเทียบข้อมูลในตัวแปร str1 กับข้อมูลในตัวแปรสตริง str2 เป็นจำนวนอักษร n ตัวโดยใช้อักษรตัวแรกที่เริ่มต่างกันเป็นหลัก และ จะมีการเปรียบเทียบในกรณีที่อักษรในตัวแปรมีจำนวนน้อยกว่า n



การประกาศใช้ฟังก์ชัน strncmp จะทำได้ดังตัวอย่างต่อไปนี้



int strncmp(char *str1, char *str2,int n)



ความแตกต่างระหว่าง strcmp และ strncmp จะแสดงให้เห็นดังตัวอย่างต่อไปนี้



strcmp(“some diff”,”some DIFF”)

            -- returns value > 0

strncmp(“some diff”,”some DIFF”,4)

            -- returns 0





                    strcat(str1,str2) – ใช้ในการนำข้อมูลในตัวแปร str2 ไปต่อท้ายตัวแปร str1  ซึ่งจะคืนค่าเป็น str1 ที่ได้รับการต่อให้ยาวขึ้น ตัวอย่างเช่น



char *s1 = “C. “, *s3 = strcat(s1,“Sinthanayothin”);

ผลลัพธ์: s1 = s3 = “C. Sinthanayothin”



การประกาศใช้ฟังก์ชัน strcat จะทำได้ดังตัวอย่างต่อไปนี้



char* strcat(char *s1, const char* s2);

                    strncat(str1,str2,n) – ใช้ในการนำข้อมูลในตัวแปร str2 จำนวน n อักษรไปต่อท้ายตัวแปร str1  ซึ่งจะคืนค่าเป็น str1 ที่ได้รับการต่อให้ยาวขึ้น ตัวอย่างเช่น



char s1[10] = "IT ";

char *s3 = strncat(s1,"050Basic",3);

printf("%s \n", s1);     printf("%s \n", s3);

ผลลัพธ์: s1 = s3 = IT 050



การประกาศใช้ฟังก์ชัน strncat จะทำได้ดังตัวอย่างต่อไปนี้



char* strncat(char *s1, const char* s2ม int n);



ฟังก์ชันเหล่านี้มีอยู่ในไลบรารีเฮดเดอร์ไฟล์ string.h ซึ่งต้องใช้คำสั่ง #include  ถึงจะเรียกใช้ได้



                    เราสามารถสร้างตารางอาเรย์ให้ตัวแปรสตริง (Array of string) ดังตัวอย่างต่อไปนี้



char month[12][10] = {“January”, “February”, “March”, “April”, “May”, “June”, “July”, “August”, “September”, “October”, “November”, “December” };

 

                    แต่ถ้าต้องการให้ตารางอาเรย์สำหรับตัวแปรสตริง สามารถรองรับข้อมูลสตริงที่มีความยาวต่างกัน (Ragged array of string) ให้ดังนี้

char *MonthNames[13]; /* an array of 13 strings */

MonthNames[1] = “January”; /* String with 8 chars */

MonthNames[2] = “February”; /* String with 9 chars */

MonthNames[3] = “March”; /* String with 6 chars */





ตัวอย่างตารางอาเรย์ให้ตัวแปรสตริงแสดงวันทั้ง 7 แบบ Ragged array of string จะแสดงให้เห็นในตัวอย่างต่อไปนี้



#include

#include

void main()

{

  char *days[7]; char TheDay[10];int day;

  days[0] = "Sunday"; days[1] = "Monday";

  days[2] = "Tuesday";                    days[3] = "Wednesday";

  days[4] = "Thursday";                  days[5] = "Friday";

  days[6] = "Saturday";

  printf("Please enter a day: ");

  scanf("%9s",TheDay);

  day = 0;

  while ((day < 7) && (strcmp(TheDay,days[day])))

        day++;

  if (day < 7) printf("%s is day %d.\n",TheDay, day);

  else printf("No day %s!\n",TheDay);

}




ในการรับและส่งข้อมูลจำพวกสตริงนั้นทำได้หลายวิธี ได้แก่

1)                ในกรณีที่ใช้คำสั่ง printf และ scanf นั้นให้ใช้ %s ในการอ่านข้อมูลและ แสดงข้อมูลสตริงออกมา

2)                ใช้คำสั่ง gets ในการข้อมูลสตริงออกมาทีละบรรทัด ดังตัวอย่างต่อไปนี้



char name1[10], name2[30];

scanf(“%s”,name1);    // Input: IT 050

gets(name2);                // Input: C Programming

printf(“Course is %s\n”,name);  // Output: IT 050

printf(“Detail is %s\n”,name2); // C Programming



  
 



การใช้งานคำสั่งกับตัวแปร อักษร (char operators)





นี่คือตัวอย่างการใช้งานฟังก์ชันที่คุมการรับส่งข้อมูลตัวอักษร



char ch;

ch = getchar();                                  // Input ch – ใช้แทน scanf("%c",&ch);

putchar(ch);                                      // Output ch – ใช้แทน printf("Character  is %c\n",ch);

ch = 'S';                                              // ใช้ได้ ตัวอย่างการกำหนดค่าตัวอักษรให้ตัวแปร char

putchar(ch);                                      // ผลที่ได้ออกมาคือ S

putchar('T');                                      // ผลที่ได้ออกมาคือ T



                    ฟังก์ชันที่ใช้กำหนดการทำงานให้ตัวแปร char ได้แก่



คำสั่ง: isalpha(ch);

การใช้งาน: คืนค่าเป็น TRUE (จริง) ถ้า ch มีค่าในช่วง A-Z หรือ a-z

ตัวอย่าง: c = isalpha(ch);    // คืนค่า TRUE ถ้า ch=‘M’ และ คืนค่า FALSE ถ้า ch=‘5’

คำสั่ง: isdigit(ch);

การใช้งาน: คืนค่าเป็น TRUE (จริง) ถ้า ch มีค่าในช่วง0-9

ตัวอย่าง: d = isdigit(ch);    // คืนค่า FALSE ถ้า ch=‘M’ และคืนค่า TRUE ถ้า ch=‘5’

คำสั่ง: islower(ch);

การใช้งาน: คืนค่าเป็น TRUE (จริง) ถ้า ch มีค่าในช่วง a-z

ตัวอย่าง: c = islower(ch);   // คืนค่า FALSE ถ้า ch=‘M’ return false, และคืนค่า TRUE ถ้า  ch=‘m’

คำสั่ง: isupper(ch);

การใช้งาน: คืนค่าเป็น TRUE (จริง) ถ้า ch มีค่าในช่วง A-Z

ตัวอย่าง: c = isupper(ch);   // คืนค่า TRUE ถ้า ch=‘M’ return false, และคืนค่า FALSE ถ้า  ch=‘m’

คำสั่ง: isspace(ch);

การใช้งาน: คืนค่า TRUE ถ้า ch คิอช่องว่างขาว (space, newline, tab )

ตัวอย่าง: c = isspace(ch);   // คืนค่า TRUE ถ้า ch = ‘\n’ คืนค่า FALSE ถ้า ch=‘m’

คำสั่ง: tolower(ch);

การใช้งาน: คืนค่าตัวพิมพ์เล็กจากค่าอักษรในตัวแปร ch ถ้าเป็นไปได้

ตัวอย่าง: c = tolower(ch);   // คืนค่า ‘m’ ให้ c ถ้า ch=‘M’

คำสั่ง: toupper(ch);

การใช้งาน: คืนค่าตัวพิมพ์ใหญ่จากค่าอักษรในตัวแปร ch ถ้าเป็นไปได้

คำสั่ง: c = toupper(ch);   // คืนค่า ‘M’ ให้ c ถ้า ch=‘m’                          


หน้าที่ 9 - โครงสร้างสตรักเจอร์

8. โครงสร้างสตรักเจอร์ (Structure)

สตรักเจอร์ เป็นวิธีการเก็บตัวแปรหลากชนิดให้อยู่เป็นกลุ่มก้อนเดียวกัน ทำให้สามารถแยกโปรแกรมออกเป็นหน่วย (Modular Programming) ซึ่งแก้ไขได้ง่ายเพราะสามารถแยกฟังก์ชันและตัวแปรออกเป็นหน่วยๆ ซึ่งก็เป็นประโยชน์ในการสร้างฐานข้อมูลด้วย

การตั้งต้นสร้างสตรักเจอร์ สามารถทำได้หลายรูปแบบดังตัวอย่างต่อไปนี้

1) การใช้ คำสั่ง struct สร้างตัวแปรชนิด student_a ผ่านตัวแปร student
struct student
{

   char *first;

   char *last;

   char SSN[9];

   float gpa;

   char **classes;

};


struct student student_a;

2) การใช้ คำสั่ง struct สร้างตัวแปรชนิด student_a โดยตรง
struct
{

    char *first;

    char *last;

    char SSN[10];

    float gpa;

    char **classes;

} student_a;


3) การใช้ คำสั่ง typedef struct เพื่อสร้างตัวแปรชนิด student_a ผ่านตัวแปร student
typedef struct
{

    char *first;

    char *last;

    char SSN[9];

    float gpa;

    char **classes;

} student;



student student_a;


การกำหนดชนิดตัวแปร ทำได้โดยใช้คำสั่ง typedef ตามหลักการใช้งานดังนี้

typedef type name (typedef ชื่อของชนิดตัวแปร ชื่อที่ใช้เรียกชนิดตัวแปรจริง)

ตัวอย่าง:
typedef int INTEGER;

                                         INTEGER x;                 /* x คือตัวแปรตระกูล INTEGER */



                                         typedef char *STRING;

                                         STRING sarray[10];

/* sarray คือตารางอาเรย์ ของ char* ซึ่งเทียบได้กับการประกาศว่า

char *sarray[10] */


ในโครงสร้างตัวแปรที่อยู่ในรูป structure นั้นประกอบด้วยตัวแปรที่เกี่ยวข้องในลักษณะเดียวกับตารางอาเรย์ แม้จะไม่ใช้ตัวแปรประเภทเดียวกัน โดยจะแบ่งตัวแปรออกเป็น field โดยที่กลุ่มตัวแปรใน structure จะถือว่าเป็นส่วนหนึ่งของหน่วยใหญ่หน่วยเดียวกันดังที่แสดงในภาพที่ 8.1 ส่วนการเปรียบเทียบความแตกต่างระหว่าง ตารางอาเรย์และตัวแปร struct ที่มีตัวแปรที่เป็นตารางอาเรย์ จะแสดงให้เห็นในภาพที่ 8.2



การเรียกใช้งาน สตรักเจอร์

โดยปกติการสร้างสตรักเจอร์ ทำได้โดยใช้คำสั่ง typedef และ struct ซึ่งโครงสร้างภายในของสตรักเจอร์ จะประกอบด้วยตัวแปรต่างๆ ซึ่งแยกออกเป็น field ตัวแปรชนิดต่างๆ และในแต่ละ field จะมีการกำหนดพื้นที่หน่วยความจำ จนเพียงพอสำหรับแต่ละ field ดังตัวอย่างต่อไปนี้
typedef struct {

  Type1 FieldName1;

  Type2 FieldName2;

  Type3 FieldName3;

  /* as needed */

} VarName;


VarName คือชื่อชนิดตัวแปรสตรักเจอร์ทั้งหมด


นี่คือตัวอย่างการประกาศใช้ตัวแปร struct ชนิด student_t เพื่อบันทึกข้อมูลนักเรียน พร้อมตัวอย่างการกำหนดตัวแปร ชนิด student_t ซึ่งสามารถทำได้อย่างตัวแปรทั่วไป เช่นเดียวกับ int float
#define   MAX_LEN  12      /*  Length of name  */

typedef   struct  {

   char      name[MAX_LEN];

   int                  id;

   float     gpa;

   char major[10];

}  student_t;



student_t   s;

student_t  stu1, stu2, stu3;


การเข้าถึง ตัวแปร field ภายในตัวแปร struct ทำได้โดยการใช้ จุด (.)แล้วตามด้วยชื่อ field ดังตัวอย่างกรณีการเข้าถึงตัวแปร ชนิด DATE ที่จะแสดงให้เห็นดังต่อไปนี้ และผลที่ได้จะแสดงให้เห็นในภาพที่ 8.3

หลักการเข้าถึงตัวแปร struct: VarName.FieldName
typedef struct
{

  int month, day, year;

} DATE;



void main() {

  DATE d1;



  d1.month = 12;

  d1.day = 2;

  d1.year = 1970;

}

TOP