עבור לתוכן

Featured Replies

פורסם
#include <stdio.h>
#include <string.h>
void f(char *p)
	{
		strcpy(p,p+2);
	}
void main()
{
	char *myName="david";
	f(myName);
	printf("%s", myName);
}

האם הפונקציה תעבוד ותקצץ את המחרוזת? אם p עובר by value אז הפונקציה אמורה לקצץ את המחרוזת המקורית?

פורסם

 

- לא מכיר דרך ב-C להעביר מחרוזת by value, מה שבפועל עובר זה פוינטר לאיבר הראשון של המחרוזת.

- אסור להשתמש ב-strcpy כשמחרוזת המקור והיעד חופפות בזכרון

נערך על-ידי etal

פורסם
  • מחבר

זה כן עובד ומקצץ לתו האחרון

void main()
{
    char f[]="abc";
    strcpy(f,f+2);
    printf("%s", f);
}

 

פורסם

לא טענתי שזה לא עובד.

השימוש ב-strcpy הוא לא נכון כי התוצאה בשימוש כזה היא undefined כלומר שפת ה-C לא מבטיחה לך תוצאה מסויימת. המשמעות היא שהתוצאה תלויה במימוש הספציפי של הפונקציה, בסביבה שונה, בקומפיילר אחר אתה עלול לקבל תוצאה שונה.

נערך על-ידי etal

פורסם
  • מחבר

אוקיי. אז כדי להבין את דבריך, זה אומר שהקוד להלן כן יעבוד וידפיס דן? [כי אני מקבל שגיאה Segmentation fault על השורה של דן)

 

void f(char *p)
	{
		strcpy(p,"Dan");
	}
void main()
{
	char *myName="david";
	f(myName);
	printf("%s", myName);
}

 

נערך על-ידי Dolmiti

פורסם

אתה צריך לשנות את התחביר לזה:

char myName[]="david";

כשאתה מצהיר ככה הוא שם את הנתונים במחסנית ולכן הזיכרון בעל הרשאת כתיבה

ראה מידע לגבי heap vs stack

פורסם
  • מחבר

תודה על תשובתך!

הצטרפ/י לדיון

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

אורח
הוסף תגובה

דיונים חדשים