วันพุธที่ 17 กันยายน พ.ศ. 2557

06:49
6.8 พอยน์เตอร์กับสตริง  (pointers  and  string)

            เนื่องจากการเก็บค่าคงที่ชนิดสตริงจะเก็บไว้ในตัวแปรสตริง ดังนั้นเมื่อเราสามารถใช้พอยน์เตอร์กับตัวแปรชุดได้  ก็ย่อมสามารถใช้พอยน์เตอร์มาจัดการกับค่าคงที่ชนิดสตริงได้เช่นกัน
            เพื่อความเข้าใจเกี่ยวกับการใช้พอยน์เตอร์กับสตริง  ให้ศึกษาโปรแกรมตัวอย่าง  6.7  และ  6.8  ดังต่อไปนี้
โปรแกรมตัวอย่างที่  6.7   แสดงการใช้พอยน์เตอร์กับสตริงในการตั้งค่าสตริงและนำออกมาแสดงที่จอภาพ

/*             ptrstr1.c */
#include<stdio.h>                                                                              /*  บรรทัดที่  1  */
#include<conio.h>                                                                             /*  บรรทัดที่  2  */
void main(void)                                                                                    /*  บรรทัดที่  3  */
{                                                                                                     /*  บรรทัดที่  4  */
      char *ptr = "Hello";                                                               /*  บรรทัดที่  5  */
      char name[80];                                                                    /*  บรรทัดที่  6  */
      clrscr( );                                                                                 /*  บรรทัดที่  7  */
      printf("Enter your name : ");                                                /*  บรรทัดที่  8  */
      gets(name);                                                                          /*  บรรทัดที่  9  */
      printf("\n%s, %s", ptr, name);                                             /*  บรรทัดที่  10  */
      printf("\n\nPress any key back to program ...");              /*  บรรทัดที่  11  */
      getch();                                                                                  /*  บรรทัดที่  12  */
}                                                                                               /*  บรรทัดที่  13  */
ผลลัพธ์ที่ได้จากโปรแกรม

แผนผังลำดับงาน: จอภาพ: Enter your name : Kannikar  Hello, Kannikar    Press any key back to program…     
คำอธิบายโปรแกรม 
            จากโปรแกรมตัวอย่างที่  6.7  สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ  ได้ดังนี้

บรรทัดที่  5  คำสั่ง char *ptr = “Hello”; มีผลทำให้ภายในหน่วยความจำมีลักษณะดังนี้


รูปที่  6.3  แสดงคำสั่ง  char  *ptr  =  “Hello”;  ในหน่วยความจำ
บรรทัดที่  8 ถึง 10  รับค่าสตริงที่ผู้ใช้ป้อนเก็บไว้ที่ตัวแปร  name แล้วนำค่าที่เก็บไว้ในตัวแปรพอยเตอร์  ptr  ชี้อยู่  และตัวแปร name แสดงออกที่จอภาพ
บรรทัดที่  11 ถึง 12  พิมพ์ข้อความให้กดคีย์ใด ๆ  เพื่อกลับเข้าสู่โปรแกรม  และหยุดรอรับค่าใด ๆ จากคีย์บอร์ด  เช่น  กด enter จะกลับเข้าสู่โปรแกรมตามลำดับ
โปรแกรมตัวอย่างที่  6.8  แสดงการใช้พอยน์เตอร์  ในการเก็บและแสดงสตริงทางจอภาพในลักษณะพิมพ์ย้อนกลับ

/*             ptrstr2.c                 */
#include<stdio.h>                                                                              /*  บรรทัดที่  1  */
#include<conio.h>                                                                             /*  บรรทัดที่  2  */
void main(void)                                                                                    /*  บรรทัดที่  3  */
{                                                                                                         /*  บรรทัดที่  4  */
      char string[81];                                                                                 /*  บรรทัดที่  5  */
      char  *pstr;         /*declaration pointer pstr */                               /*  บรรทัดที่  6  */
      int j=0;                                                                                           /*  บรรทัดที่  7  */
      clrscr( );                                                                                         /*  บรรทัดที่  8  */
      printf("Enter your string : ");                                                             /*  บรรทัดที่  9  */
      gets(string);                                                                                   /*  บรรทัดที่  10  */
      pstr=string;                                                                                   /*  บรรทัดที่  11  */
   while(*pstr)                                                                                        /*  บรรทัดที่  12  */
{                                                                                                     /*  บรรทัดที่  13  */
      j++;                                                                                          /*  บรรทัดที่  14  */
      pstr++;                                                                                       /*  บรรทัดที่  15  */
}                                                                                                      /*  บรรทัดที่  16  */
      printf("\nLength of String is...%d\n", j);                                          /*  บรรทัดที่  17*/
      pstr--;                                                                                        /*  บรรทัดที่  18  */
      printf("\nReverse String is...");                                                /*  บรรทัดที่  19  */
 while(j>0)                                                                                      /*  บรรทัดที่  20  */
      {                                                                                            /*  บรรทัดที่  21  */
            printf("%c", *pstr);                                                             /*  บรรทัดที่  22  */
            pstr--;                                                                                /*  บรรทัดที่  23  */
            j--;                                                                                     /*  บรรทัดที่  24  */
}                                                                                                     /*  บรรทัดที่  25  */
      printf("\n\nPress any key back to program ...");                           /*  บรรทัดที่  26  */
      getch();                                                                                               /*  บรรทัดที่  27  */
}                                                                                                      /*  บรรทัดที่  28  */

ผลลัพธ์ที่ได้จากโปรแกรม


แผนผังลำดับงาน: จอภาพ: Enter your string : nakhonphanom  Length of String is…12  Reverse String is…monahpnohkan    Press any key back to program…
คำอธิบายโปรแกรม 
            จากโปรแกรมตัวอย่างที่  6.8  สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ  ได้ดังนี้

บรรทัดที่  6  คำสั่ง  char *pstr;  ประกาศตัวแปรพอยน์เตอร์ ชื่อ pstr ชนิด char
บรรทัดที่  9 และ 10  รับค่าสตริงที่ผู้ใช้ป้อนกลับมาเก็บไว้ในตัวแปร string
บรรทัดที่ 11  คำสั่ง  pstr=string;  เป็นการกำหนดตำแหน่งแรกของตัวแปร  string  ให้กับ พอยน์เตอร์  ptr
บรรทัดที่  12 ถึง 16    คำสั่ง  while(*pstr)  {  j++;  pstr++;  }   เป็นการทำงานตามเงื่อนไขในคำสั่ง    while  คือ  *pstr   เป็นจริงให้ทำงานในคำสั่ง  j++;  และ  pstr++;  ตามลำดับ  ในกรณีนี้ค่า  *pstr  จะเป็นเท็จก็ต่อเมื่อเจอค่า  \0  (null  character)  ซึ่งอยู่ตรงท้ายสุดของข้อมูลสตริง  จึงจะทำให้ออกจากคำสั่ง  while  ได้
บรรทัดที่  17 แสดงค่าความยาวของสริงที่ผู้ใช้ป้อนซึ่งนับเก็บไว้ที่ตัวแปร j ออกทางจอภาพ
บรรทัดที่  18  คำสั่ง  pstr- -;  เป็นคำสั่งให้พอยน์เตอร์เคลื่อนกลับมา  1  ตัวอักขระ  ทำให้พอยน์เตอร์  pstr ย้ายจากการชี้ที่  \0  มาอยู่ที่ตัวอักขระตัวสุดท้ายในกรณีที่เติมข้อความว่า  nakhonphanom  ตัวอักขระตัวสุดท้ายคือ  ตัวอักษร  m
บรรทัดที่  19 แสดงสตริงที่ผู้ใช้เติมในลักษณะพิมพ์กลับ
บรรทัดที่  20 ถึง 25  คำสั่ง  while(j>0)  {  printf(“%c”,*pstr);  pstr- -;  j- -;  }  เป็นการตรวจสอบเงื่อนไขในคำสั่ง  while  คือค่าตัวแปร  j  ถ้ามีค่ามากกว่า  0  (ศูนย์)   แสดงว่าเป็นจริงให้พิมพ์ค่าที่ตัวแปรพอยน์เตอร์ชี้อยู่ออกทางจอภาพ แล้วเคลื่อนที่พอยน์เตอร์จากด้านหลังของตัวแปรสตริงมาทางด้านหน้าทีละ  1  ตัวอักขระ  จากนั้นลดค่าในตัวแปร  j  ลงครั้งละ  1  ทำซ้ำ ๆ  เช่นนี้จนกว่าค่าตัวแปร  j  มีค่าเท่ากับ  0  จึงออกจากคำสั่ง  while  ได้  
บรรทัดที่  26 ถึง 27  พิมพ์ข้อความให้กดคีย์ใด ๆ  เพื่อกลับเข้าสู่โปรแกรม  และหยุดรอรับค่าใด ๆ จากคีย์บอร์ด  เช่น  กด enter จะกลับเข้าสู่โปรแกรมตามลำดับ

0 ความคิดเห็น:

แสดงความคิดเห็น