មេរៀនទី៨: String & Text

មេរៀនទី៨: String & Text

I.    តើ String គឺជាអ្វី ? String គឺជាស៊េរីនៃ Character ដាក់ក្នុង ចន្លោះ សញ្ញា double quote (“ ”) ដែល មានរាប់បញ្ចូលទាំង Space និងសញ្ញាពិសេសផ្សេងៗ (‘\0’) ទៀត រាល់ពេលយើងបញ្ចេញឃ្លាមួយ លើ អេក្រង់ដោយប្រើ printf(), គឺយើងបានអោយ និយមន័យឃ្លា នោះ ថាជា String Constant។
ឧទាហរណ៍ដូចជា ៖
printf(“This is a string.”);

printf(“UC”);

printf(“UNIVERSITY”);

បណ្ដា  Character របស់ String មួយ ត្រូវបានផ្ទុកក្នុង Byte Memory មួយដោយ  តំលៃ ASCII របស់ Character នោះ។ ASCII របស់ Character នីមួយៗ ត្រូវបានដំរៀប ជាប់ៗគ្នា ពីមួយទៅមួយក្នុង Memory និងពេលចប់ String នោះក្នុង  Memory ត្រូវផ្ទុក ‘\0’ ដែលជាសញ្ញាបញ្ចប់ String។ ចូរពិនិត្យមើលថា តើ String Constance នៃឧទាហរណ៍ទាំង 3 ខាងលើត្រូវបានទុកក្នុង Memory យ៉ាងដូម្ដេច? ចូរមើលក្នុងរូប ខាងក្រោម  ៖

 C ប្រើសញ្ញាពិសេស (\0) ដែល  S  μីសូន  សញ្ញ   String ដូច្នេះការរក្សា    មួយនៅក្នុង Memory នោះចំនួន Byt    តូវប្រើ      តែលើស  ចំនួន  Character នៃ String មួយ

ឧទាហរណ៍ ៖
#include “stdio.h”
#include “conio.h”
void m

{

pr  0 is   d to  inate   ing”); printf(“The character to t        ate     ng is    e end    trin getch();

}

លទ្ធផលលើអេក្រង់គឺ ៖

The character

The character to terminate a string is at the end of string

បន្ទាត់ទី  1 វាបង្ហាញតែ The character ព្រោះតែមានសញ្ញាបញ្ចប់ String (‘\0’)

នៅចន្លោះកណ្ដាល (ដែលពេលនេះ (‘\0’) ត្រូវបានយើងដាក់ដោយខ្លួនឯង)។

បន្ទាត់ទី 2 វាបង្ហាញទាំងអស់ ពីព្រោះសញ្ញាបញ្ចប់ String (‘\0’) នៅខាងចុង ក្រោយបង្អស់នៃ

String (ដែលពេលនេះ (‘\0’) ត្រូវបានដាក់បំពេញដោយ Compiler)។

II.       មធ្យោបាយប្រើប្រាស់  String
II.1     ការប្រកាសអថេរString ដោយ    Array of char

char9ឈេμាះអថេរ[ចំនួនតួអក្សរ];

ឧទាហរណ៍ដូចជា ៖

char str[20] ;
ពេលនេះយើងបាន អថេរ str អាចផ្ទុកបានរហូតដល់ 19 Character ចំណែកឯ មួយ Byte

ចុងក្រោយសំរាប់ទុក ‘\0’។

ការភ្ជាប់តំលៃចាប់ផ្ដើមអោយ   String :

+   យើងអាចភ្ជាប់តំលៃចាប់ផ្ដើមអោយអថេរ String តាមរបៀបដូចខាងក្រោម ៖

char string[] = “This is a string”;

នេះជាការប្រកាស String ដែលមានឈេμាះ string , គμាន កំណត់ ចំនួនតួអក្សរ ហើយភ្ជាប់តំលៃចាប់ផ្ដើមអោយភ្លាមដោយឃ្លា This is a string។  ពេលនេះ Compiler នឹងផ្គត់ផ្គង់

Memory ចំនួន  17 byte ដោយរាប់បញ្ចូលទាំង ‘\0’ (សញ្ញាបញ្ចប់ String) សំរាប់អថេរ string។ ការប្រកាសតាមទំរង់ខាងលើនេះ គឺមិនអាចគμានការភ្ជាប់តំលៃចាប់ផ្ដេឺមបានទេ បើសិនជា គμានការភ្ជាប់តំលៃចាប់ផ្ដើមនោះ Compiler នឹងមិនអាច កំណត់ចំនួន byte ដែលត្រូវផ្គត់ផ្គង់សំរាប់អថេរនេះបានឡើយ ដែលជាហេតុនាំអោយមានកំហុសភ្លាម។

+  យើងអាចភ្ជាប់តំលៃចាប់ផ្ដើមអោយផ្នែកមួយរបស់ Array of char តាមរបៀប ដូចខាងក្រោម ៖

char str[40] = “To do”;

Compiler នឹងផ្គត់ផ្គង់ Memory ចំនួន  40 byte សំរាប់អថេរ str ក្នុងនោះ  5 ធាតុដំបូងចាប់ពី str[0]…str[4] ត្រូវបានភ្ជាប់ តំលៃចាប់ ផ្ដើមដោយពាក្យ To9do ចំណែកឯ បណ្ដាធាតុចាប់ពី str[5] រហូតដល់ str[39] ត្រូវបានផ្ទុកតំលៃសូន្យទាំងអស់ (ត្រូវចាំថា  សូន្យគឺជាតំលៃ ASCII របស់សញ្ញាបញ្ចប់ String ‘\0’) តែធាតុទាំងនេះយើងអាច ប្រើប្រាស់វាអោយផ្ទុកតំលៃផ្សេងនៅពេលក្រោយបាន។ចូរពិនិត្យមើលកមμវិធីខាងក្រោម ដែលមានការប្រកាសអថេរ string ជាមួយនឹងការ ភ្ជាប់តំលៃចាប់ផ្ដើមអោយវានៅពេលប្រកាសភ្លាម បន្ទាប់មកយើងអាចប្រើអថេរដែលបាន ភ្ជាប់តំលៃចាប់ផ្ដើមនេះ អោយរក្សាទុក  String ណាមួយផ្សេងទៀតបាន។ ក្នុងនោះក៏មាន ការបង្ហាញអំពីរបៀបប្រើ scanf ដើម្បីបញ្ចូលទិន្នន័យអោយអថេរ string ដែរ។

#include <stdio.h>

#include <conio.h>

void main()

{

char string[40] = “hello”; /* ភ្ជាប់តំលៃចាប់ផ្ដើមអោយអថេរ string */

clrscr()

printf(“\nstring : %s”, string); /* បង្ហាញតំលៃរបស់ string */ scanf(“%s”, string); /* បញ្ចូលទិន្នន័យថμីអោយអថេរ string */ printf(“\nstring : %s”, string); /* បង្ហាញទិន្នន័យថμីរបស់ string */ getch();

}

បើយើងបញ្ចូលថា abcdefghijkl នោះ លទ្ធផលរបស់កមμវិធីគឺ ៖

string : hello abcdefghijkl._

string : abcdefghijkl

+   យើងអាចភ្ជាប់តំលៃចាប់ផ្ដើមអោយ String Constant តាមទំរង់ដូចខាងក្រោម ៖

const char str[] = “Hello world”;

ក្រោយពេលប្រកាសនេះរួច str មិនអាចផ្លាស់ប្ដូរទិន្នន័យបានទេ ព្រោះវាត្រូវបាន

ប្រកាសជាចំនួនថេរដោយពាក្យគន្លឹះ const រួចទៅហើយ។

II.2 ទិន្នន័យចេញ    និងទិន្នន័យចូលជា   String
II.2.1 ទិន្នន័យអានចូលមានប្រភេទជា String

ខាងក្រោមនេះជាបណ្ដាអនុគមន៍សំរាប់អានយកទិន្នន័យប្រភេទ String :

+      scanf(“%s”, str); អនុគមន៍សំរាប់អាន String ដែលគμាន Space, tab, \n ពី Keyboard។

ឧទាហរណ៍ថា បើអ្នកវាយបញ្ចូលនូវឃ្លា Welcome to BBU នោះអនុគមន៍ scanf នឹងអានបានតែពាក្យ Welcome ប៉ុណ្ណោះ។

+      gets(str) ជាអនុគមន៍សំរាប់អានយកបណ្ដា Character (String) ដែលបាន បញ្ចូលពី Keyboard រួចភ្ជាប់អោយទៅបណ្ដា ធាតុនីមួយៗ របស់ str រហូតដល់ពេលណា ដែលអ្នកប្រើបានចុច Enter នោះទើប ចប់ ការអាន។ ដូច្នេះ  gets មានលទ្ធភាពអាចអាន យកបានទាំង Space និង Tab។

II.2.2.    បង្ហាញទិន្នន័យដែលមានប្រភេទជា String                                                                                             បណ្ដាអនុគមន៍ដែលមានមុខងារសំរាប់បង្ហាញទិន្នន័យប្រភេទជា String លើអេក្រង់ រួមមានដូចជា ៖

printf(“Test string”);

puts(“Test string”);

អនុគមន៍ទាងំ
ពីរខាងលេេី នះសុទ្ធតែមានមខុងារបង្ហាញឃ្លា Test string លើអេក្រង់ ក៏ប៉ុន្ដែវាមានលក្ខណៈខុសគ្នាបន្ដិចត្រង់ថា ក្រោយពេលបង្ហាញ String ដែលស្ថិតក្នុងសញ្ញា bouble quotលើអេក្រង់រួច ហើយ អនុគមន៍ puts នឹងបញ្ជូន Cursor អោយចុះទៅកាន់ ដើមបន្ទាត់ថμី។

 III.   Array of String                                                                               អ្នកបានដឹងរួចមកហើយថា String អាចត្រូវបានគេរក្សាទុកនៅក្នុង Array មួយ វិមាត្រ។ នៅក្នុងចំណុចនេះ អ្នកនឹងបានឃើញអំពី របៀបប្រើ Array ពីរវិមាត្រដើម្បីរក្សា ទុក String ដែលជួរដេក នីមួយៗរបស់វាត្រូវបានផ្ទុក String មួយរៀងៗខ្លួន។  ចូរពិនិត្យមើល ឧទាហរណ៍ខាងក្រោមនេះ ៖

#include <stdio.h>
#include <conio.h>
void main()

{

char str[2][50] =  { {“To be or not to be , “},

{“that is the question”}

};

int count1 = 0; /* ប្រវែងរបស់ String ទី 1 */

int count2 = 0 ; /* ប្រវែងរបស់ String ទី 2 */

/* កំណត់ប្រវែងរបស់ String ទី 1 */

clrscr();

while(str[0][count1] != ‘\0’) /* ខណៈដែលមិនមែនជាសញ្ញា ‘\0’ */

count1++; /* បង្កើនតំលៃអថេររាប់ */

/* កំណត់ប្រវែងរបស់ String ទី 2 */

while(str[1][count2] != ‘\0’)

count2 ++;

/* ពិនិត្យមើលតើ String str[0] មានទំហំគ្រប់គ្រាន់សំរាប់ផ្ទុក String

ទាំងពីរខាងលើដែរឬទេ? */

if(sizeof(str[0]) < count1+count2 + 1)

printf(“\nNot enough space.”);

else

{    /* ចាប់ផ្ដើមតំលៃអថេររាប់ count2 ជាថμីឡើងវិញ */

count2 = 0;

/* ចំលងពី  String ទី 2 បន្ថែមទៅលើ String ទី 1 */

while((str[0][count1++] = str[1][count2++]) != ‘\0’ );

/* បង្ហាញ  String ទី 1 ក្រោយពេលចំលងរួចលើអេក្រង់ */

printf(“\n%s”,str[0]);

}

getch();

}

លទ្ធផលរបស់កមμវិធីលើអេក្រង់គឺ ៖

To be or not to be , that is the question

ឧទាហរណ៍ទី 2 : ប្រើ Array 2 វិមាត្រដើម្បីដំរៀប String

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<conio.h>

 

void arrange(int n, char x[][12]); /*ប្រកាសទំរង់អនុគមន៍ */

void main()

{

int i, n=0;

char x[10][12];

clrscr();

printf(“Input strings on the difference line \n\n”);

printf(“press \’end\’to finish\n\n”);

/* អានយកបណ្ដា String ពី Keyboard */

do{

printf(“string %d:”, n+1);

scanf(“%s”, x[n]);

}while (strcmp(x[n++],”end”)); /* ប្រៀបធៀបមើលថាតើ String ដែល

បានបញ្ចូលមុននេះជា “end” ដែរឬទេ?  */

/* បន្ថយតំលៃ  n */

n–;

/* ហៅអនុគមន៍ដើម្បីដំរៀបបណ្ដា String ដែលបានបញ្ចូល */

arrange(n, x);

/* បង្ហាញបណ្ដា String ក្រោយពេលដំរៀបលើអេក្រង់ */

printf(“\n\nString arranged:\n”);

for(i=0;i<n;++i)

printf(“\nString %d: %s”,i+1,x[i]);

getch();

}

/* ប្រកាសអនុគមន៍ដំរៀបបណ្ដា String */

void arrange(int n,char x[][12])

{

char temp[12];

int i,item;

for(item = 0;item <n-1;++item)

/* កំណត់  String តូចជាងគេនៅក្នុងបណ្ដា String ដែលនៅសល់ */

for(i = item+1; i<n; ++i)

if(strcmp(x[item], x[i])>0)/* ប្ដូរទីតាំង  */

{    strcpy(temp, x[item]);

strcpy(x[item], x[i]);

strcpy(x[i], temp);

}

 

}

ឧបមាថា  បើអ្នកបញ្ចូល ៖

hello._

abc._ efgh._ end._

លទ្ធផលលើអេក្រង់គឺ ៖

abc

efgh hello

 IV.   អនុគមន៍មួយចំនួនសំរាប់ប្រើជាមួយ String
1.     strcat សំរាប់តភ្ជាប់ String
ទំរង់អនុគមន៍ ៖

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

មុខងារ  ៖ សំរាប់តភ្ជាប់ String s2 ពីក្រោយ String s1ហើយភ្ជាប់អោយទៅ s1។

/*—— កមμវិធី Prog7_1.C ——*/

#include <string.h>

#include <stdio.h>

#include <conio.h>

void main()

{

char destination[25];

char *blank = ” “, *c = “C++”, *turbo = “Turbo”;

clrscr();

/* ចំលង  String turbo អោយទៅ String destination */

strcpy(destination, turbo);

/* បន្ថែម String blank ពីក្រោយ String destination */

strcat(destination, blank);

/* បន្ថែម String c ពីក្រោយ String destination */

strcat(destination, c);

 

/* បង្ហាញ  String destination លើអេក្រង់  */

printf(“%s\n”, destination);

getch();

}

លទ្ធផលបង្ហាញលើអេក្រង់គឺ ៖

Turbo C++

 

ទំរង់អនុគមន៍ ៖

char *strchar(char *s , int ch)

មុខងារ  ៖ ស្វែងរកតួអក្សរ  ch ដំបូងបំផុតក្នុង String s។ ប្រសិនបើរកឃើញនោះ អនុគមន៍នឹងបោះអាសយដ្ឋានរបស់តួអក្សរ ch ក្នុង String s តែបើផ្ទុយទៅវិញអនុគមន៍បោះ តំលៃ NULL។

/*—— កមμវីធី  Prog7_2.C ——*/

#include <string.h>

#include <stdio.h>

#include”conio.h” void main()

{

char string[25];

char *ptr, c = ‘r’; /* c ផ្ទុកតួអក្សរដែលត្រូវស្វែងរកក្នុង String */

clrscr();

/* ចំលង  String constance អោយទៅអថេរ  string */

strcpy(string, “hitr ssdferilsdkf”);

/* ស្វែងរកតួអក្សរ  c នៅក្នុង  String string បើឃើញ  នោះភ្ជាប់អាសយដ្ឋាន របស់តួអក្សរក្នុង string នោះអោយទៅ Pointer ptr */

ptr = strchr(string, c);

if (ptr) /* ប្រសិនបើ ptr ខុសពី  NULL នោះបានន័យថាបានរកឃើញ c */

printf(“The character %c is at position: %d\n”, c, ptr-string);

else /* ប្រសិនបើរក c ក្នុង string មិនឃើញ  */

printf(“The character was not found\n”);

getch();

}

លទ្ធផលលើអេក្រង់គឺ ៖

The character ‘r’ is at position: 3
3.      strrchr ស្វែងរកតួអក្សរមួយដែលនៅខាងក្រោយបង្អស់នៃ String                                                    

ទំរង់អនុគមន៍ ៖

char *strrchr(char *s , int ch);

មុខងារ  ៖ ស្វែងរកតួអក្សរ  ch ដែលស្ថិតនៅចុងក្រោយបង្អស់ក្នុង String s។ បើ សនិ នោះអនុគមន៍នឹងបោះអាសយដ្ឋានរបស់តួអក្សរ ch ក្នុង String s តែបើផ្ទុយ ទៅវិញនោះអនុគមន៍នឹងបោះតំលៃ NULL។

/*——- កមμវិធី Prog7_3.C ——–*/

#include <string.h>

#include <stdio.h>

#include”conio.h” void main()

{

រកឃើញ
char string[25];
char *ptr, c = ‘o’; /* c ផ្ទុកតួអក្សរដែលត្រូវស្វែងរកក្នុង String */

clrscr();

/* ចំលង  String constance អោយទៅអថេរ  string */

strcpy(string, “Welcome to cambodia”);

/* ស្វែងរកតួអក្សរ  c ក្រោយគេបំផុតក្នុង String string បើឃើញ  នោះភ្ជាប់ អាសយដ្ឋានរបស់តួអក្សរក្នុង string នោះអោយទៅ Pointer ptr */

ptr = strrchr(string, c);

if (ptr) /* ប្រសិនបើ ptr ខុសពី  NULL នោះបានន័យថាបានរកឃើញ c */

printf(“The character %c is at position: %d\n”, c, ptr-string);

else /* ប្រសិនបើរក c ក្នុង string មិនឃើញ  */

printf(“The character was not found\n”);

getch();

}

លទ្ធផលលើអេក្រង់គឺ ៖

The character o is at position: 15

4.     strcmp ប្រៀបធៀប String ពីរ ដោយបែងចែកអក្សរតូច និងអក្សរធំ

ទំរង់អនុគមន៍ ៖

int strcmp(char *s1, char *s2);

មុខងាររបស់អនុគមន៍ គឺសំរាប់ប្រៀបធៀបរវាង String ចំនួនពីរគឺ String s1 ជា មួយ String s2 ដោយមានការបែងចែកអក្សរតូច និងអក្សរធំ។ ចូរពិនិត្យមើលឧទាហរណ៍ ខាងក្រោមដើម្បីស្វែងយល់ អំពីរបៀបប្រើអនុគមន៍។

ក្រោយពេលប្រើអនុគមន៍នេះ បើយើងទទួលបានតំលៃពីអនុគមន៍គឺ ៖

+   តំលៃ < 0 ប្រសិនបើ s1 < s2

+   តំលៃ = 0 ប្រសិនបើ s1 = s2

+   តំលៃ > 0 ប្រសិនបើ s1 > s2

/*——- កមμវិធី Prog7_4.C ——–*/

#include <string.h>

#include <stdio.h>

#include <conio.h>

void main()

{

char *buf1 = “aaa”, *buf2 = “bbb”, *buf3 = “ccc”;

int ptr;

clrscr();

/* ប្រៀបធៀប String buf2 ជាមួយ buf1 */

ptr = strcmp(buf2, buf1);

if (ptr > 0) /* ប្រសិនបើ buf2 ធំជាង  buf1 */

printf(“buffer 2 is greater than buffer 1\n”);

else /* ផ្ទុយទៅវិញប្រសិនបើ buf2 តូចជាង  buf1 */

printf(“buffer 2 is less than buffer 1\n”);

/* ប្រៀបធៀប String buf2 ជាមួយ buf3 */

ptr = strcmp(buf2, buf3);

if (ptr > 0) /* ប្រសិនបើ buf2 ធំជាង  buf3 */

printf(“buffer 2 is greater than buffer 3\n”);

else /* ផ្ទុយទៅវិញប្រសិនបើ buf2 តូចជាង  buf3 */

printf(“buffer 2 is less than buffer 3\n”);

getch();

}

លទ្ធផលរបស់កមμវិធីលើអេក្រង់គឺ ៖

buffer 2 is greater than buffer 1

buffer 2 is less than buffer 3

5.     strcmpi ប្រៀបធៀប String ពីរ ដោយគμានការបែងចែកអក្សរតូចធំ    

ទំរង់អនុគមន៍ ៖

int strcmpi(char *s1 , char *s2);

អនុគមន៍នេះក៏ធ្វើការដូចគ្នាជាមួយ strcmp ដែរ ប៉ុន្ដែវាមិនបែងចែកអក្សរតូចធំទេ។

បានន័យថាវាចាត់ទុក “AbCd” ក៏ដូចជា  “ABCD” និង ក៏ដូចជា  “abcd” ដែរ។

 6.     strcpy ចំលង String មួយអោយទៅ String  មួយទៀត

ទំរង់អនុគមន៍ ៖

char *strcpy(char *s1, char *s2);

មុខងាររបស់អនុគមន៍គឺ ចំលង  String s2 អោយទៅ String s1 តែក្រោយពេល ចំលងរួច String

s2 មិនមានប្រែប្រួលតំលៃឡើយ។ ពេលនេះទិន្នន័យចាស់របស់ String s1

ត្រូវបានជំនួសទៅដោយទិន្នន័យថμីរបស់ String s2 ដើម្បីងាយយល់ ចូរអ្នកត្រលប់ទៅ

ពិនិត្យមើលឧទាហរណ៍ Prog7_2.C និង Prog7_3.C នៃទំព័រទី 243 និង 244 ខាងលើ។

  7.     strcspn កំណត់ទីតាំងដំបូងរបស់តួអក្សរណាមួយក្នុង String មេ    

 ទំរង់អនុគមន៍ ៖

int strcspn(char *s, char *schild);

អនុគមន៍នេះមានមុខងារពិនិត្យបណ្ដា Character ក្នុង String s ម្ដងមួយៗ ចាប់ពី  ក្បាល String s ទៅរហូតដល់ខាងចុងនៃ String s ដែលក្នុងខណៈនោះ ប្រសិនបើមាន ជួប Character ណា មួយដែល មាននៅក្នុង String schild នោះការពិនិត្យ ត្រូវបានបញ្ឈប់ ភា្ល ម បន្ទាប់មកភ្ជាប់តំលៃទីតាំងរបស់ Character នៅពេលវាបានជួបនោះ អោយទៅឈេμាះ របស់អនុគមន៍។

 /*—— កមμវិធី Prog7_5.C ——-*/

#include <stdio.h>

#include <conio.h>

#include <string.h>

#include <alloc.h>

void main()

{

char *string1 = “1234567890”;

char *string2 = “747DC8”;

int length;

clrscr();

/* ពិនិត្យមើលតើតួអក្សររបស់ string2 មាននៅក្នុង string1 ដែរឬទេ?

បើមានតើស្ថិតនៅត្រង់ទីតាំងទីប៉ុនμាននៃ string1 */

length = strcspn(string1, string2);

printf(“Character where strings intersect is at position %d\n”, length);

getch();

}

លទ្ធផលរបស់កមμវិធីគឺ ៖

Character where strings intersect is at position 3

អនុគមន៍បោះតំលៃ 3 ព្រោះពេល Scan string1 ដល់ទីតាំងទី 3 ជួបតួលេខ ‘4’ ដោយ ‘4’

មានក្នុង  string2 ដូច្នេះវាក៏បឈ្ឈប់ការ Scan ត្រឹមនោះ  ហើយក៏បោះទីតាំង នោះអោយទៅអថេរ length

តែម្ដង។

  8.     strspn កំណត់ទីតាំងដំបូងរបស់តួអក្សរណាមួយក្នុង String មេ ដែលគμាននៅក្នុង String កូន

ទំរង់អនុគមន៍ ៖

int strspn(char *s, char *schild);

អនុគមន៍នឹងពិនិត្យ String s មួយតួម្ដងៗ  ប្រសិនបើក្នុង s វាជួបនូវ  Character ណាមួយដែលគμាននៅក្នុង String schild នោះវានឹង បឈ្ឈប់ការ Scan ពិនិត្យភ្លាម ហើយ ក៏បោះតំលៃទីតាំងដែលវាបាន Scan ដល់នៅពេលបញ្ឈប់នោះ អោយទៅឈេμាះរបស់ អនុគមន៍។

 /*—– កមμវិធី Prog7_6.C ——*/

#include <stdio.h>

#include <string.h>

#include <conio.h>

int main(void)

{

char *string1 = “1234567890”; char *string2 = “1234abcd567”; int length;

clrscr();

length = strspn(string1, string2);

printf(“Character where strings differ is at position %d\n”, length);

getch();

return 0;

}

លទ្ធផលលើអេក្រង់គឺ ៖

Character where strings differ is at position 7

length ទទួលបានតំលៃ 7 ពីព្រោះ  នៅពេលវា Scan ដល់ទីតាំងទី 7 នៃ string1 វាក៏បានជួប ‘8’ ដែល ‘8’ នេះពុំមាននៅក្នុង string2 ទេ ដូច្នេះវាក៏បឈ្ឈប់ការ Scan ត្រឹមនេះ ហើយបោះតំលៃទីតាំង ពេល បញ្ឈប់គឺ 7 នោះអោយទៅឈេμាះអនុគមន៍តែម្ដង។

 9.     សតរដុផ ចំលង String មួយទៅទុកក្នុង Memory ថμីដែលបានផ្គត់ផ្គង់ ដោយអនុគមន៍ strdup                                        ទំរង់អនុគមន៍

char *strdup(char *s);

អនុគមន៍នេះមានមុខងារសំរាប់ផ្គត់ផ្គង់ Memory ដើម្បីផ្ទុក String ដែលចំលង បានពី String s។ បើអនុគមន៍អនុវត្ដការងារបានជោគជ័យ នោះអនុគមន៍នឹងបោះ អាសយ- ដ្ឋានរបស់បណ្ដុំ Memory ដែលវាបានផ្គត់ផ្គង់នោះ បើផ្ទុយទៅវិញវានឹងបោះតំលៃ NULL។

/*—– កមμវិធី Prog7_7.C ——*/#include <stdio.h>

#include <string.h>

#include <alloc.h>

#include <conio.h>

void main()

{

char *dup_str, *string = “abcde”;

clrscr();

/* ផ្គត់ផ្គង់ Memory អោយទៅ dup_str ដើម្បីផ្ទុក String ដែលចំលងចេញ ពី String string*/

dup_str = strdup(string);

/* បង្ហាញ  dup_str លើអេក្រង់  */

printf(“%s\n”, dup_str);

/* បង្ហាញអាសយដ្ឋានរបស់ string */

printf(“string address :%d\n”,string);

/* បង្ហាញអាសយដ្ឋានរបស់ dup_str */

printf(“New address :%d\n”,dup_str);

/* រំដោះ  Memory ដែល dup_str កំពុងតែប្រើប្រាស់ចេញវិញ */

free(dup_str);

getch();

}

លទ្ធផលរបស់កមμវិធីគឺ ៖

abcde

string address : 170 new address : 1484

 10.   stricmp ប្រៀបធៀប String ពីរដោយគμានការបែងចែកអក្សរតូចធំ                                          ទំរង់អនុគមន៍ ៖

int stricmp(char *s1 , char *s2);

ដំណើរការរបស់វាដូចគ្នាទៅនឹងដំណើរការរបស់អនុគមន៍ strcmpi ដែរ ចំណែកឯ លទ្ធផលរបស់វាវិញ គឺអោយដូចគ្នាជាមួយ លទ្ធផល របស់អនុគមន៍ strcmp ប៉ុន្ដែអនុគមន៍ នេះប្រៀបធៀបដោយ គμានការបែងចែកអក្សរតូចអក្សរធំទេ។

/* កមμវិធី Prog7_8.C */#include <string.h>

#include <stdio.h>

#include <conio.h>

void main()

{

char *buf1 = “BBB”, *buf2 = “bbb”;

int ptr;

clrscr();

/* ប្រៀបធៀប String buf1 ជាមួយនឹង  buf2 */

ptr = stricmp(buf2, buf1);

if (ptr > 0) /* ប្រសិនបើ buf2 ធំជាង  buf1 */

printf(“buffer 2 is greater than buffer 1\n”);

if (ptr < 0) /* ប្រសិនបើ buf2 តូចជាង  buf1 */

printf(“buffer 2 is less than buffer 1\n”);

if (ptr == 0) /* ប្រសិនបើ buf2 និង buf1 ដូចគ្នា  */

printf(“buffer 2 equals buffer 1\n”);

getch();

}

លទ្ធផលរបស់កមμវិធីលើអេក្រង់គឺ ៖

buffer 2 equals buffer 1

 11.   strlen kMNt;RbEvgrbs;  String

 ទំរង់អនុគមន៍ ៖

int strlen(char *s);

អនុគមន៍នេះមានតួនាទីសំរាប់កំណត់ចំនួន Character ដែលមានក្នុង String តែវា មិនបានរាប់ទាំងសញ្ញាបញ្ចប់ String គឺ ‘\0’ ទេ។


/*——- កមμវិធី Prog7_9.C ——-*/

#include <stdio.h>

#include <string.h>

#include <conio.h>

void main()

{

char *string = “Borland International”;

clrscr();

printf(“%d\n”, strlen(string));

getch();

}

លទ្ធផលរបស់កមμវិធីលើអេក្រង់គឺ ៖21

 12.         strlwr ប្ដូរពីអក្សរធំទៅជាអក្សរតូចទាំងអស់

ទំរង់អនុគមន៍ ៖

char *strlwr(char *s);

មុខងាររបស់អនុគមន៍គឺ បណ្ដាតួអក្សរធំក្នុង String s ត្រូវបានប្ដូរទៅជាអក្សរតូច វិញទាំងអស់។

/*—— កមμវិធី Prog7_10.C ——–*/

#include <stdio.h>

#include <string.h>

#include”conio.h” void main()

{

char *string = “Borland International”;

clrscr();

printf(“String prior to strlwr : %s\n”, string);

/* ប្ដូរពីអក្សរធំទៅជាអក្សរតូចវិញទាំងអស់ */

strlwr(string);

printf(“String after strlwr :  %s\n”, string);

getch();

}

លទ្ធផលរបស់កមμវិធីលើអេក្រង់គឺ ៖

String prior to strlwr : Borland International

String after strlwr :    borland international

13.   strncat បន្ថែម n តួអក្សររបស់ String source អោយទៅ String destination                                       

 ទំរង់អនុគមន៍ ៖

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

មុខងាររបស់អនុគមន៍ គឺភ្ជាប់បណ្ដា Character ចំនួន  n តួដំបូងរបស់  String s2 អោយទៅ

String s1។ ប្រសិនបើ n ធំជាងប្រវែងរបស់ s2 នោះវានឹងភ្ជាប់តំលៃ s2 ទាំងមូលបន្ថៃមពីក្រោយ s1

តែម្ដង។

/*—— កមμវិធី Prog7_11.C ——*/

#include <string.h>

#include <stdio.h>

#include <conio.h>

void main()

{

char destination[25];

char *source = ” States in usa”;

clrscr();

/* ចំលង  String Constance អោយទៅ destination */

strcpy(destination, “United”);

/* តភ្ជាប់ 7 តួអក្សរដំបូងរបស់ source អោយទៅ destination */

strncat(destination, source, 7);

/* បង្ហាញ  String destination លើអេក្រង់  */

printf(“%s\n”, destination);

getch();

}

លទ្ធផលរបស់កមμវិធីលើអេក្រង់គឺ ៖

United States

 14.   strncmp ប្រៀបធៀប n តួអក្សរដំបូងរបស; String ពីរ   ទំរង់អនុគមន៍ ៖

int strncmp(char *s1 , char *s2 , int n);

អនុគមន៍នេះមានមុខងារធ្វើការប្រៀបធៀប n តួអក្សរដំបូងរបស់ String s1 ជាមួយនឹង  n តួអក្សរដំបូងរបស់ String s2 ដោយមាន ការបែងចែកអក្សរតូចធំ។ តំលៃ របស់អនុគមន៍ដែលនឹងទទូលបានគឺ ៖

–        តំលៃ < 0 ប្រសិនបើ n តួដំបូងរបស់ s1 តួចជាង  n តួដំបូងរបស់ s2

–        តំលៃ = 0 ប្រសិនបើ n តួដំបូងរបស់ s1 ដូចគ្នាជាមួយ n តួដំបូងរបស់ s2

–        តំលៃ > 0 ប្រសិនបើ n តួដំបូងរបស់ s1 ធំជាង  n តួដំបូងរបស់ s2

/*—– កមμវិធី Prog7_12.C —–*/

#include <string.h>

#include <stdio.h>

#include <conio.h>

void main()

{

char *buf1 = “aaabbb”, *buf2 = “bbbccc”, *buf3 = “ccc”;

int ptr;

clrscr();

/* ប្រៀបធៀប 3 តួដំបូងរវាង buf2 និង buf1 */

ptr = strncmp(buf2, buf1,3);

if (ptr > 0)

printf(“buffer 2 is greater than buffer 1\n”);

else

printf(“buffer 2 is less than buffer 1\n”);

/* ប្រៀបធៀប 3 តួដំបូងរវាង buf2 និង buf3 */

ptr = strncmp(buf2,buf3,3);

if (ptr > 0)

printf(“buffer 2 is greater than buffer 3\n”);

else
printf(“buffer 2 is less than buffer 3\n”);

getch();

}

លទ្ធផលរបស់កមμវិធីគឺ ៖

buffer 2 is greater than buffer 1

buffer 2 is less than buffer 3

15.   strnicmp ប្រៀបធៀប n តួដំបូងរបស់ String ពីរដោយគμានការបែង ចែកអក្សរតូចធំ

 ទំរង់អនុគមន៍ ៖

int strnicmp(char *s1 , char *s2 , int n);

ធ្វើការដូចគ្នាជាមួយ strncmp ដែរ តែវាគμានការបែងចែកអក្សរតូច និងអក្សរធំ  ឡើយ។

/*—– កមμវិធី Prog7_13.C ——*/

#include <string.h>

#include <stdio.h>

#include”conio.h” void main()

{

char *buf1 = “BBBccc”, *buf2 = “bbbccc”;

int ptr;

clrscr();

ptr = strnicmp(buf2, buf1, 3);

if (ptr > 0)

printf(“buffer 2 is greater than buffer 1\n”);

if (ptr < 0)

printf(“buffer 2 is less than buffer 1\n”);

if (ptr == 0)

printf(“buffer 2 equals buffer 1\n”);

getch();

}

លទ្ធផលរបស់កមμវិធីគឺ ៖

buffer 2 equals buffer 1

 16.   strncpy ចំលង n តួអក្សរពី String source អោយទៅ String destination                   

ទំរង់អនុគមន៍ ៖

char *strncpy(char *s1 , char *s2 , int n);

អនុគមន៍នេះមានមុខងារចំលង n តួដំបូងរបស់ String s2 អោយទៅ String s1

ដោយទិន្នន័យចាស់របស់ S1 ត្រូវបាត់បង់។


/*——- កមμវិធី Prog7_14.C ——-*/

#include <stdio.h>

#include <string.h>

#include <conio.h>

void main()

{   char string[10];

char *str1 = “abcdefghi”;

clrscr();

/* ចំលង  3 តួដំបូងរបស់ str1 អោយទៅ string */

strncpy(string, str1, 3);

/* ដាក់សញ្ញាបញ្ចប់ String នៅធាតុទី  4 របស់ string */

string[3] = ‘\0’;

printf(“%s\n”, string);

getch();

}

លទ្ធផលលើអេក្រង់គឺ ៖abc

 17.   strnset ប្ដូរ n តួអក្សរដំបូងរបស់ String  eដាយតួអក្សរផ្សេងវិញ

ទំរង់អនុគមន៍ ៖

char *strnset(char *s , int c , int n);

មុខងាររបស់អនុគមន៍ strnset គឺត្រូវជំនួស n តួដំបូងរបស់ string s ដោយ Character c វិញ។

/*——- កមμវិធី Prog7_15.C ———*/

#include <stdio.h>

#include <string.h>

#include <conio.h>

void main()

{

char *string = “abcdefghijklmnopqrstuvwxyz”;

char letter = ‘x’;

clrscr();

printf(“String before strnset: %s\n”, string);

/* ជំនួស  13 តួដំបូងរបស់ string ដោយអក្សរ ‘x’ */

strnset(string, letter, 13);

printf(“String after strnset: %s\n”, string);

getch();

 

}

លទ្ធផលរបស់កមμវិធីគឺ ៖

String before strnset: abcdefghijklmnopqrstuvwxyz

String after strnset:  xxxxxxxxxxxxxnopqrstuvwxyz

 18.   strrev ត្រឡប់បញ្ច្រាស់តួអក្សររបស់ String

ទំរង់អនុគមន៍ ៖

char *strrev(char *s);

អនុគមន៍នេះមានមុខងារបញ្ច្រាស់បណ្ដាតួអក្សរក្នុង String s ពីខាងចុងមកខាង ក្បាលវិញ។ បើបានអនុវត្ដបានសំរេច អនុគមន៍នឹងបោះអាសយដ្ឋានរបស់ string ដែលបាន

បញ្ច្រាស់  តែបើផ្ទុយទៅវិញនោះអនុគមន៍នឹងបោះតំលៃ NULL។

*—— កមμវិធី Prog7_16.C ——*/

#include <string.h>

#include <stdio.h>

#include <conio.h>

void main()

{

char *forward = “string”;

clrscr();

printf(“Before strrev(): %s\n”, forward);

/* បញ្ច្រាស់  String forward */

strrev(forward);

printf(“After strrev(): %s\n”, forward);

getch();

}

លទ្ធផលរបស់កមμវិធី ៖

Before strrev():string

After strrev():gnirts

 19.   strset ជំនួសបណ្ដា Character របស់ String មួយដោយ Character ch vij    

ទំរង់អនុគមន៍ ៖

char *strset(char *s,int ch);អនុគមន៍នេះមានមុខងារប្ដូរបណ្ដាតួអក្សរទាំងអស់របស់ String s ដោយតួអក្សរ  ដែលមាន  ASCII

ផ្ទុកដោយ  ch វិញ។

/*—— កមμវិធី Prog7_17.C ——-*/

#include <stdio.h>

#include <string.h>

#include <conio.h>

void main()

{   char string[10] = “123456789”;

char symbol = ‘c’;

clrscr();

printf(“Before strset(): %s\n”, string);

/* ប្ដូរបណ្ដាតួអក្សររបស់ string ដោយ symbol វិញ */

strset(string, symbol);

printf(“After strset(): %s\n”, string);

getch();

}

លទ្ធផលរបស់កមμវិធី ៖

Before strset(): 123456789

After strset(): ccccccccc

20.   strstr ស្វែងរក String មួយក្នុង String មួយផ្សេងទៀត

ទំរង់អនុគមន៍ ៖

char *strstr(char *s1,char *s2);

អនុគមន៍នេះនឹងស្វែងរក String s2 ដែលបានលេចឡើងដំបូង បង្អស់ នុង String s1។ បើសិនជារកឃើញនោះអនុគមន៍ នឹងអាសយដ្ឋាន របស់ String s2 ដែលកំពុងតែ នៅក្នុង  String s1 នោះ តែបើផ្ទុយ ទៅវិញ វានឹងបោះតំលៃ NULL។

/*—— កមμវិធី Prog7_18.C ——*/#include <stdio.h>

#include <string.h>

#include <conio.h>

void main()

{

char *str1 = “Borland International”, *str2 = “nation”, *ptr;

clrscr();

/* ស្វែងរកមើលតើមាន s2 នៅក្នុង  s1 ដែរឬទេ?  */

ptr = strstr(str1, str2);

if(ptr==NULL)

printf(“\nNot found”);

else

printf(“The substring is: %s\n”, ptr);

getch();

}

 លទ្ធផលរបស់កមμវិធីគឺ ៖ The substring is: national

 21.   strupr  ប្ដូរពីអក្សរតូចទៅអក្សរធំ      

 ទំរង់អនុគមន៍ ៖

char *strupr(char *s);

បណ្ដាតួអក្សរតូចក្នុង String s នឹងត្រូវបានប្ដូរទៅជាអក្សរធំវិញទាំងអស់។ ក្រោយ ពេលប្ដូររួច

អនុគមន៍នឹងបោះអាសយដ្ឋានរបស់ String s

/*—– កមμវិធី Prog7_19.C ——*/

#include <stdio.h>

#include <string.h>

#include <conio.h>

void main()

{

char *string = “abcdefghijklmnopqrstuvwxyz”, *ptr;

clrscr();

/* ប្ដូរបណ្ដាតួអក្សររបស់ String string អោយទៅជាអក្សរធំវិញ */

ptr = strupr(string);

printf(“%s\n”, ptr);

getch();

}

លទ្ធផលរបស់កមμវិធីលើអេក្រង់គឺ ៖

ABCDEFGHIJKLMNOPQRSTUVWXYZ

 សំណួរ

 1.      នៅក្នុង  String តើសញ្ញា ‘\0’គឺជាអ្វី? តំលៃ ASCII គឺប៉ុនμាន?
2.      ចូរនិយាយអំពីរទំរង់រក្សាទុកទិន្នន័យនៃការប្រកាសខាងក្រោម ៖char *str = “My String”;
3.      និយាយអំពីភាពខុសគ្នានៃការប្រើ scanf ជាមួយ gets ដើម្បីអាន String?