כיצד להשתמש ב- Strcpy () בשפת C?

How Use Strcpy C Language



במאמר זה, אנו הולכים ללמוד על הפונקציה strcpy () בשפת התכנות C. הפונקציה strcpy () היא פונקציית ספרייה סטנדרטית מאוד פופולרית לביצוע פעולת העתקת המיתרים בשפת התכנות C. ישנם מספר קבצי כותרות סטנדרטיים בשפת התכנות C לביצוע פעולות סטנדרטיות. String.h הוא אחד מקבצי הכותרות האלה, המספק מספר פונקציות ספרייה סטנדרטיות לביצוע פעולות מחרוזת. הפונקציה strcpy () היא אחת מפונקציות הספרייה המסופקות על ידי string.h.

תחביר:

לְהַשְׁחִיר* strcpy (לְהַשְׁחִיר*יעד_מיקום, קבוע לְהַשְׁחִיר*מקור_מחרוזת);

הבנת strcpy ():

המטרה היחידה של הפונקציה strcpy () היא להעתיק מחרוזת ממקור ליעד. כעת, בואו נסתכל על התחביר לעיל של הפונקציה strcpy (). הפונקציה strcpy () מסוגלת לקבל שני פרמטרים -







  • יעד * char
  • const char * מקור

המקור הוא קבוע כאן כדי להבטיח שפונקציית strcpy () לא תוכל לשנות את מחרוזת המקור. הפונקציה strcpy () מעתיקה את כל התווים (כולל התו NULL בסוף המחרוזת) ממחרוזת המקור ליעד. לאחר השלמת פעולת ההעתקה ממקור ליעד, הפונקציה strcpy () מחזירה את כתובת היעד לפונקציית המתקשר.



הנקודה החשובה שיש לשים לב אליה היא, הפונקציה strcpy () אינה מצרפת את מחרוזת המקור עם מחרוזת היעד. הוא מחליף את תוכן היעד בתוכן מחרוזת המקור.



כמו כן, הפונקציה strcpy () אינה מבצעת בדיקות כלשהן על מנת לוודא שגודל היעד הוא יותר ממחרוזת המקור, היא באחריותו של המתכנת בלבד.





דוגמאות:

כעת, נראה מספר דוגמאות להבנת הפונקציה strcpy ():

  1. strcpy () - פעולה רגילה (example1.c)
  2. strcpy ()-מקרה -1 (דוגמה 2.c)
  3. strcpy ()-Case-2 (example3.c)
  4. strcpy ()-מקרה -3 (דוגמה 4.c)
  5. strcpy () - גרסה מוגדרת משתמש (example5.c)
  6. strcpy () - מותאמת גרסה מוגדרת על ידי משתמש (example6.c)

strcpy () - פעולה רגילה (example1.c):

תוכנית לדוגמה זו מראה כיצד לבצע פעולת העתקת מחרוזות רגילה באמצעות הפונקציה strcpy () בשפת התכנות C. שים לב שאורך מחרוזת היעד הוא 30 (char destination_str [30];), שהוא גדול יותר מאורך מחרוזת המקור (האורך הוא 18 כולל התו NULL) כך שהיעד יכול להכיל את כל התווים מתוך מחרוזת מקור.



#לִכלוֹל
#לִכלוֹל

intרָאשִׁי()
{
לְהַשְׁחִירsource_str[] = 'www.linuxhint.com';
לְהַשְׁחִיריעד_סטר[30];

printf ('לפני קריאת הפונקציה strcpy (): n n');
printf (' tמחרוזת מקור = %s n',source_str);
printf (' tמחרוזת יעד = %s n n',יעד_סטר);

strcpy (יעד_סטר,source_str);

printf ('לאחר ביצוע הפונקציה strcpy (): n n');
printf (' tמחרוזת מקור = %s n',source_str);
printf (' tמחרוזת יעד = %s n n',יעד_סטר);

לַחֲזוֹר 0;
}

strcpy ()-מקרה -1 (דוגמה 2.c):

הכוונה של תוכנית דוגמה זו היא להסביר בבירור מה קורה כאשר אורך מחרוזת היעד קטן מאורך מחרוזת המקור. במקרים כאלה, למיקום היעד לא יהיו מספיק רווחים/בתים בכדי להכיל את כל התווים (כולל תו NULL) ממחרוזת המקור. שני דברים שכדאי תמיד לזכור:

  1. הפונקציה strcpy () לא תבדוק אם ליעד יש מספיק מקום.
  2. הדבר עלול להיות מסוכן בתוכנות מוטבעות מכיוון שה- strcpy () יחליף את אזור הזיכרון מעבר לגבול היעד.

הבה נבחן את התוכנית לדוגמא. הכרזנו source_str ואתחלנו אותו ל- www.linuxhint.com , שייקח לאחסן 18 בתים, כולל תו ה- Null בסוף המחרוזת. לאחר מכן, הכריזנו על מערך תווים נוסף כלומר destination_str בגודל 5. בלבד. לכן, destination_str אינו יכול להחזיק את מחרוזת המקור בגודל כולל של 18 בתים.

ובכל זאת, אנו קוראים לפונקציה strcpy () להעתיק את מחרוזת המקור למחרוזת היעד. מהפלט שלהלן, אנו יכולים לראות שה- strcpy () לא התלונן כלל. במקרה זה, הפונקציה strcpy () תתחיל להעתיק את התו ממחרוזת המקור (עד שתמצא את התו NULL במחרוזת המקור) לכתובת היעד (למרות שגבול היעד חורג). המשמעות היא שפונקציית strcpy () אינה מבצעת בדיקת גבול למערך היעד. בסופו של דבר, הפונקציה strcpy () תחליף את כתובות הזיכרון שאינן מוקצות למערך היעד. זו הסיבה שבגללה הפונקציה strcpy () תחליף את מיקומי הזיכרון שעשויים להיות מוקצים למשתנה אחר.

בדוגמה זו אנו יכולים לראות מהפלט שלהלן כי הפונקציה strcpy () מחליפה את מחרוזת המקור עצמה. מתכנתים צריכים תמיד להיות זהירים בהתנהגות כזו.

#לִכלוֹל
#לִכלוֹל

intרָאשִׁי()
{
לְהַשְׁחִירsource_str[] = 'www.linuxhint.com';
לְהַשְׁחִיריעד_סטר[5];

printf ('לפני קריאת הפונקציה strcpy (): n n');
printf (' tמחרוזת מקור = %s n',source_str);
printf (' tמחרוזת יעד = %s n n',יעד_סטר);

strcpy (יעד_סטר,source_str);

printf ('לאחר ביצוע הפונקציה strcpy (): n n');
printf (' tמחרוזת מקור = %s n',source_str);
printf (' tמחרוזת יעד = %s n n',יעד_סטר);

// printf ('כתובת מקור = %u (0x %x) n', & source_str [0], & source_str [0]);
// printf ('כתובת יעד = %u (0x %x) n', & destination_str [0], & destination_str [0]);

לַחֲזוֹר 0;
}

strcpy ()-Case-2 (example3.c):

תוכנית זו ממחישה את המצב כאשר גודל מחרוזת היעד גדול מגודל מחרוזת המקור ומחרוזת היעד כבר מאתחלת עם ערך כלשהו. בדוגמה זו, אתחלנו:

  • source_str ל www.linuxhint.com [גודל = 17+1 = 18]
  • destination_str ל- I_AM_A_DESTINATION_STRING [size = 25+1 = 26]

הפונקציה strcpy () תעתיק את כל 17 התווים ואת התו NULL ממחרוזת המקור למחרוזת היעד. אבל, זה לא יחליף/ישנה את הבייטים הנותרים (בת 19 עד 26, מבוסס אחד) במערך היעד. השתמשנו בלופ כדי לחזור על מערך היעד ולהדפיס את המערך כולו כדי להוכיח שהבייטים 19 עד 26 אינם משתנים במערך היעד. לכן אנו רואים את הפלט האחרון כ:

www.linuxhint.com_STRING .

#לִכלוֹל
#לִכלוֹל


/* תוכנית זו ממחישה את המצב כאשר:

גודל מחרוזת יעד> גודל מחרוזת מקור

ואנו מבצעים את הפונקציה strcpy () כדי להעתיק את
מחרוזת מקור ליעד.

הערה: גודל מחרוזת היעד תמיד צריך להיות
להיות גדול או שווה למחרוזת המקור.
* /

intרָאשִׁי()
{
לְהַשְׁחִירsource_str[] = 'www.linuxhint.com';
לְהַשְׁחִיריעד_סטר[26] = 'I_AM_A_DESTINATION_STRING';

printf ('לפני קריאת הפונקציה strcpy (): n n');
printf (' tמחרוזת מקור = %s n',source_str);
printf (' tמחרוזת יעד = %s n n',יעד_סטר);

strcpy (יעד_סטר,source_str);

printf ('לאחר ביצוע הפונקציה strcpy (): n n');
printf (' tמחרוזת מקור = %s n',source_str);
printf (' tמחרוזת יעד = %s n n',יעד_סטר);


/* הדפס מחרוזת יעד באמצעות לולאה*/
printf ('הדפס את מחרוזת היעד char by char: n n');
printf (' tמחרוזת יעד = ');

ל(intאני=0;אני<25;אני++)
{
printf ('% c',יעד_סטר[אני]);
}
printf (' n n');

לַחֲזוֹר 0;
}

strcpy ()-Case-3 (example4.c):

התייחסנו לתוכנית זו כדוגמה להראות שאסור לנו לקרוא ל- strcpy () עם מחרוזת מילולית כיעד. זה יגרום להתנהגות לא מוגדרת ובסופו של דבר התוכנית תקרוס.

#לִכלוֹל
#לִכלוֹל

intרָאשִׁי()
{
לְהַשְׁחִירsource_str[] = 'www.linuxhint.com';

printf ('לפני קריאת הפונקציה strcpy (): n n');
printf (' tמחרוזת מקור = %s n',source_str);

/* לעולם אל תתקשר ל- strcpy () עם מחרוזת מילולית כיעד.
התוכנית תקרוס.
* /

strcpy ('destination_str',source_str);

printf ('לאחר ביצוע הפונקציה strcpy (): n n');
printf (' tמחרוזת מקור = %s n',source_str);

לַחֲזוֹר 0;
}

strcpy () - גרסה מוגדרת משתמש (דוגמא 5.c):

בתוכנית דוגמה זו, הראנו כיצד לכתוב גרסה המוגדרת על ידי המשתמש של הפונקציה strcpy ().

#לִכלוֹל
לְהַשְׁחִיר *strcpy_user_defined(לְהַשְׁחִיר *dest, קבוע לְהַשְׁחִיר *src);

/ * גרסת המשתמש המוגדרת של הפונקציה strcpy () */
לְהַשְׁחִיר *strcpy_user_defined(לְהַשְׁחִיר *dest, קבוע לְהַשְׁחִיר *src)
{
לְהַשְׁחִיר *dest_backup=dest;

בזמן(*src! = ' 0') /* חזור עד שיימצא ' 0'.*/
{
*dest= *src; / * העתק את סימני המקור ליעד */
src++; / * מצביע מקור התוספת */
dest++; / * מצביע יעד להגדלה */
}

*dest= ' 0'; /* הכנס ' 0' ליעד מפורשות*/

לַחֲזוֹרdest_backup;
}

intרָאשִׁי()
{
לְהַשְׁחִירsource_str[] = 'www.linuxhint.com';
לְהַשְׁחִיריעד_סטר[30];

printf ('לפני קריאת פונקציית העתקת מחרוזת שהוגדרה על ידי המשתמש: n n');
printf (' tמחרוזת מקור = %s n',source_str);
printf (' tמחרוזת יעד = %s n n',יעד_סטר);

/ * קורא פונקציית העתקת מחרוזת שהוגדרה על ידי משתמש */
strcpy_user_defined(יעד_סטר,source_str);

printf ('לאחר ביצוע פונקציית העתקת מחרוזת שהוגדרה על ידי משתמש: n n');
printf (' tמחרוזת מקור = %s n',source_str);
printf (' tמחרוזת יעד = %s n n',יעד_סטר);

לַחֲזוֹר 0;
}

strcpy () - מותאמת גרסה מוגדרת על ידי משתמש (דוגמא 6.c):

כעת, בתוכנית דוגמה זו, אנו הולכים לייעל את הגירסה המוגדרת על ידי המשתמש של strcpy ().

#לִכלוֹל
לְהַשְׁחִיר *strcpy_user_defined(לְהַשְׁחִיר *dest, קבוע לְהַשְׁחִיר *src);


/ * גרסה מותאמת של פונקציית strcpy () שהוגדרה על ידי המשתמש */
לְהַשְׁחִיר *strcpy_user_defined(לְהַשְׁחִיר *dest, קבוע לְהַשְׁחִיר *src)
{
לְהַשְׁחִיר *dest_backup=dest;

בזמן(*dest++ = *src++)
;

לַחֲזוֹרdest_backup;
}

intרָאשִׁי()
{
לְהַשְׁחִירsource_str[] = 'www.linuxhint.com';
לְהַשְׁחִיריעד_סטר[30];

printf ('לפני קריאת פונקציית העתקת מחרוזת שהוגדרה על ידי המשתמש: n n');
printf (' tמחרוזת מקור = %s n',source_str);
printf (' tמחרוזת יעד = %s n n',יעד_סטר);

/ * קורא פונקציית העתקת מחרוזת שהוגדרה על ידי משתמש */
strcpy_user_defined(יעד_סטר,source_str);

printf ('לאחר ביצוע פונקציית העתקת מחרוזת שהוגדרה על ידי משתמש: n n');
printf (' tמחרוזת מקור = %s n',source_str);
printf (' tמחרוזת יעד = %s n n',יעד_סטר);

לַחֲזוֹר 0;
}

סיכום :

הפונקציה strcpy () היא פונקציית ספרייה מאוד פופולרית ושימושית לביצוע פעולת העתקת המיתרים בשפת התכנות C. זה משמש בעיקר להעתיק את המחרוזת ממיקום אחד למיקום אחר. עם זאת, אנו רוצים לחזור על העובדה כי הפונקציה strcpy () אינה מבצעת את בדיקת הגבול של מערך היעד, מה שעלול להוביל לבאג רציני בתוכנה אם תתעלם מכך. האחריות של המתכנת היא תמיד לוודא שלמערך היעד יש מספיק מקום להכיל את כל הדמויות ממחרוזת המקור כולל התו NULL.