name = “ C. Sinthanayothin\"; // ผดิอยา่ กาหนดตวั แปรสตริงใหต้ วั แปรอาเรยด์ ว้ ยวธิ ีน้ีstrcpy(name,“ C. Sinthanayothin\"); // ใชไ้ ด,้ ใหก้ ๊อปป้ี ค่าสตริงโดยใชค้ าส่ัง strcpystrcpy(dept,\"IT\"); // ใชไ้ ด,้ กอ๊ ปป้ี ค่าสตริง ลงในตวั แปร deptprintf(\"%s %s %sn\",d,s,dept); // ใชไ้ ด,้ แสดงผลค่าสตริงดว้ printf d = strcpy(s,\"EE\"); // ใชไ้ ด,้ น่ีคือการคืนค่าตวั แปรสตริง ลงใน ตวั แปร dดว้ ยคาส่ัง strcpyprintf(\"%s %s %s %sn\",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 arraychar *str;// วธิ ้ีทาใหต้ วั แปร str เป็น l-value เพราะเป็น ตวั แปรพอยเตอร์strcpy(c1, c2); // ใชไ้ ด,้ ก๊อปป้ี ขอ้ มลู ใน c2 ลงใน c1str = 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; /* puts ‘ A’ in ch, 10 in inum andchar buffer[100] = “ A10 50.0” ;sscanf(buffer,” %c%d%f” ,&ch,&inum,&fnum);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 %sn” ,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#includeint 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=%sn\",num,val,word); sprintf(s,\"%d/%d/%d\", mon, day, year); printf(\"s = %sn\",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#includevoid 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 > 0strncmp(“ 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#includevoid 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 050gets(name2); // Input: C Programmingprintf(“ Course is %sn” ,name); // Output: IT 050printf(“ Detail is %sn” ,name2); // C Programmingการใช้งานคาสั่งกบั ตัวแปร อกั ษร (char operators)นี่คือตวั อยา่ งการใชง้ านฟังกช์ นั ท่ีคุมการรับส่งขอ้ มูลตวั อกั ษรchar ch; // Input ch – ใชแ้ ทน scanf(\"%c\",&ch);ch = getchar(); // Output ch – ใชแ้ ทน printf(\"Character is %cn\",ch);putchar(ch); // ใชไ้ ด้ ตวั อยา่ งการกาหนดค่าตวั อกั ษรใหต้ วั แปร charch = 'S'; // ผลท่ีไดอ้ อกมาคือ Sputchar(ch); // ผลที่ไดอ้ อกมาคือ Tputchar('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’โครงสร้างสตรักเจอร์8. โครงสร้างสตรักเจอร์ (Structure) สตรักเจอร์ เป็นวธิ ีการเกบ็ ตวั แปรหลากชนิดใหอ้ ยเู่ ป็นกลุ่มกอ้ นเดียวกนัทาใหส้ ามารถแยกโปรแกรมออกเป็นหน่วย (Modular Programming)
ซ่ึงแกไ้ ขไดง้ ่ายเพราะสามารถแยกฟังกช์ นั และตวั แปรออกเป็นหน่วยๆซ่ึงกเ็ ป็นประโยชนใ์ นการสร้างฐานขอ้ มูลดว้ ย การต้งั ตน้ สร้างสตรักเจอร์ สามารถทาไดห้ ลายรูปแบบดงั ตวั อยา่ งต่อไปน้ี1) การใช้ คาสง่ั struct สร้างตวั แปรชนิด student_a ผา่ นตวั แปร studentstruct 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 ผา่ นตวั แปร studenttypedef struct{ char *first; char *last; char SSN[9]; float gpa; char **classes;} student;student student_a;การกาหนดชนิดตวั แปร ทาไดโ้ ดยใชค้ าสัง่ typedef ตามหลกั การใชง้ านดงั น้ีtypedef type name (typedef ช่ือของชนิดตวั แปร ชื่อท่ีใชเ้ รียกชนิดตวั แปรจริง)ตวั อยา่ ง:
typedef int INTEGER; /* x คือตวั แปรตระกลู INTEGER */ INTEGER x; 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.FieldNametypedef struct{ int month, day, year;} DATE;void main() { DATE d1; d1.month = 12; d1.day = 2; d1.year = 1970;}
เอาล่ะค่ะ ตอนน้ี ผอู้ ่านกค็ งจะพอเขา้ ใจการเขียนโปรแกรมภาษา C กนั บา้ งไม่มากกน็ อ้ ยแต่การรู้อยา่ งเดียวอาจจะไม่เพียงพอ กค็ งตอ้ งหดั เขียน หดั ทาประกอบกนั ไปดว้ ยเพอื่ เพม่ิ ความเขา้ ใจ และเป็นการฝึ กฝนการพฒั นาโปรแกรมคอมพิวเตอร์ในอีกทางหน่ึงดว้ ยสาหรับท่านใดท่ีทดลองเขียน และพบปัญหา กส็ ามารถ e-mail เขา้ มาคุยกนั ไดน้ ะค่ะ ที่ e-mail: [email protected] สาหรับบทความน้ีกข็ อจบแต่เพียงเท่าน้ีค่ะ
Search