פורסם 2022 בינואר 283 שנים #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 אז הפונקציה אמורה לקצץ את המחרוזת המקורית?
פורסם 2022 בינואר 283 שנים - לא מכיר דרך ב-C להעביר מחרוזת by value, מה שבפועל עובר זה פוינטר לאיבר הראשון של המחרוזת. - אסור להשתמש ב-strcpy כשמחרוזת המקור והיעד חופפות בזכרון נערך 2022 בינואר 283 שנים על-ידי etal
פורסם 2022 בינואר 283 שנים מחבר זה כן עובד ומקצץ לתו האחרון void main() { char f[]="abc"; strcpy(f,f+2); printf("%s", f); }
פורסם 2022 בינואר 283 שנים לא טענתי שזה לא עובד. השימוש ב-strcpy הוא לא נכון כי התוצאה בשימוש כזה היא undefined כלומר שפת ה-C לא מבטיחה לך תוצאה מסויימת. המשמעות היא שהתוצאה תלויה במימוש הספציפי של הפונקציה, בסביבה שונה, בקומפיילר אחר אתה עלול לקבל תוצאה שונה. נערך 2022 בינואר 283 שנים על-ידי etal
פורסם 2022 בינואר 283 שנים מחבר אוקיי. אז כדי להבין את דבריך, זה אומר שהקוד להלן כן יעבוד וידפיס דן? [כי אני מקבל שגיאה Segmentation fault על השורה של דן) void f(char *p) { strcpy(p,"Dan"); } void main() { char *myName="david"; f(myName); printf("%s", myName); } נערך 2022 בינואר 283 שנים על-ידי Dolmiti
פורסם 2022 בינואר 283 שנים אתה צריך לשנות את התחביר לזה: char myName[]="david"; כשאתה מצהיר ככה הוא שם את הנתונים במחסנית ולכן הזיכרון בעל הרשאת כתיבה ראה מידע לגבי heap vs stack
הצטרפ/י לדיון
בשלב זה תוכל/י להצטרף לדיון, ולאחר מכן להצטרף לקהילה שלנו. אם כבר יש לך חשבון אצלנו, אנא התחבר/י עכשיו על מנת להגיב תחת שם המשתמש שלך.
לתשומת לבך: התגובה תופיע לגולשים לאחר אישור של צוות הנהלת הפורומים.