ผลต่างระหว่างรุ่นของ "Psl/ตัวอย่างการเขียนพอยน์เตอร์กับสตริง"
ไปยังการนำทาง
ไปยังการค้นหา
Jittat (คุย | มีส่วนร่วม) (หน้าที่ถูกสร้างด้วย 'หน้านี้รวมตัวอย่างการเขียนพอยน์เตอร์กับสตริง =...') |
Jittat (คุย | มีส่วนร่วม) |
||
(ไม่แสดง 7 รุ่นระหว่างกลางโดยผู้ใช้คนเดียวกัน) | |||
แถว 1: | แถว 1: | ||
+ | : ''หน้านี้เป็นส่วนหนึ่งของ [[Problem solving lab]]'' | ||
+ | |||
หน้านี้รวมตัวอย่างการเขียนพอยน์เตอร์กับสตริง | หน้านี้รวมตัวอย่างการเขียนพอยน์เตอร์กับสตริง | ||
+ | |||
+ | สตริงในภาษาซีเก็บเป็นอาร์เรย์ของ char โดยมีอักขระหมายเลข 0 เป็นตัวปิดท้าย (null-terminated string) ในหลาย ๆ กรณีเราสามารถจัดการสตริงได้สะดวกด้วยพอยน์เตอร์ | ||
== การหาความยาว == | == การหาความยาว == | ||
+ | ในภาษาซี เรามีฟังก์ชัน <tt>strlen</tt> สำหรับหาความยาวของสตริง ในตัวอย่างนี้ เราทดลองเขียนฟังก์ชันดังกล่าวโดยใช้พอยน์เตอร์ | ||
− | <syntaxhighlight lang=" | + | <syntaxhighlight lang="cpp"> |
#include <cstdio> | #include <cstdio> | ||
แถว 25: | แถว 30: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
+ | == การคัดลอกสตริง == | ||
+ | ในภาษาซี เรามีฟังก์ชัน <tt>strcpy</tt> สำหรับหาความยาวของสตริง ในตัวอย่างนี้ เราทดลองเขียนฟังก์ชันดังกล่าวโดยใช้พอยน์เตอร์ | ||
+ | |||
+ | สังเกตว่า | ||
+ | |||
+ | * เราต้องสั่ง <tt>*dp = '\0';</tt> ในตอนท้ายด้วย เพื่อปิดสตริง | ||
+ | * ฟังก์ชัน <tt>mystrcpy</tt> นั้นคืนค่า pointer ของสตริงปลายทางมาด้วย เราเขียนกรณีดังกล่าวเผื่อไว้สำหรับการใช้งานที่สะดวกขึ้น เช่น เราอาจจะสั่ง <tt>printf("%s\n", mystrcpy(dst,src));</tt> ได้เลย | ||
+ | |||
+ | <syntaxhighlight lang="cpp"> | ||
+ | #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); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == เปลี่ยน a เป็น z == | ||
+ | |||
+ | <syntaxhighlight lang="cpp"> | ||
+ | #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); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == ขยับ (เปลี่ยน a เป็น b, b เป็น c,...) == | ||
+ | |||
+ | <syntaxhighlight lang="cpp"> | ||
+ | #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); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == การใช้ fgets ในการอ่านสตริงทีละบรรทัด == |
รุ่นแก้ไขปัจจุบันเมื่อ 07:04, 16 กุมภาพันธ์ 2558
- หน้านี้เป็นส่วนหนึ่งของ 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);
}