Psl/ตัวอย่างการเขียนพอยน์เตอร์กับสตริง

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
หน้านี้เป็นส่วนหนึ่งของ Problem solving lab

หน้านี้รวมตัวอย่างการเขียนพอยน์เตอร์กับสตริง

สตริงในภาษาซีเก็บเป็นอาร์เรย์ของ char โดยมีอักขระหมายเลข 0 เป็นตัวปิดท้าย (null-terminated string) ในหลาย ๆ กรณีเราสามารถจัดการสตริงได้สะดวกด้วยพอยน์เตอร์

การหาความยาว

ในภาษาซี เรามีฟังก์ชัน strlen สำหรับหาความยาวของสตริง ในตัวอย่างนี้ เราทดลองเขียนฟังก์ชันดังกล่าวโดยใช้พอยน์เตอร์

#include <cstdio>

int mystrlen(char* st)
{
  int l = 0;
  char* p = st;
  while(*p != '\0') {
    p++;
    l++;
  }
  return l;
}

char buffer[1000];

main()
{
  scanf("%s", buffer);
  printf("%d\n", mystrlen(buffer));
}

การคัดลอกสตริง

ในภาษาซี เรามีฟังก์ชัน strcpy สำหรับหาความยาวของสตริง ในตัวอย่างนี้ เราทดลองเขียนฟังก์ชันดังกล่าวโดยใช้พอยน์เตอร์

สังเกตว่า

  • เราต้องสั่ง *dp = '\0'; ในตอนท้ายด้วย เพื่อปิดสตริง
  • ฟังก์ชัน mystrcpy นั้นคืนค่า pointer ของสตริงปลายทางมาด้วย เราเขียนกรณีดังกล่าวเผื่อไว้สำหรับการใช้งานที่สะดวกขึ้น เช่น เราอาจจะสั่ง printf("%s\n", mystrcpy(dst,src)); ได้เลย
#include <cstdio>

char* mystrcpy(char* dest, char* src)
{
  char* sp = src;
  char* dp = dest;
  
  while(*sp != '\0') {
    *dp = *sp;
    sp++;
    dp++;
  }
  *dp = '\0';
  return dest;
}

char buffer[1000];
char outbuffer[1000];

main()
{
  scanf("%s", buffer);
  mystrcpy(outbuffer, buffer);
  printf("%s\n", outbuffer);
}

เปลี่ยน a เป็น z

#include <cstdio>

char* atoz(char* st)
{
  char* p = st;
  while(*p != '\0') {
    if(*p == 'a')
      *p = 'z';
    p++;
  }
  return st;
}

char buffer[1000];

main()
{
  scanf("%s", buffer);
  atoz(buffer);
  printf("%s\n", buffer);
}

ขยับ (เปลี่ยน a เป็น b, b เป็น c,...)

#include <cstdio>

char* nextchar(char* st)
{
  char* p = st;
  while(*p != '\0') {
    *p = (*p) + 1;
    p++;
  }
  return st;
}

char buffer[1000];

main()
{
  scanf("%s", buffer);
  nextchar(buffer);
  printf("%s\n", buffer);
}

การใช้ fgets ในการอ่านสตริงทีละบรรทัด