עבור לתוכן

שאלה בקשר לפונקציה strcpy.

Featured Replies

פורסם

שלום לכולם.

שאלה פשוטה לי אליכם:

האם הפונקציה strcpy יכולה להעתיק רק מחרוזת מסוג char[] ל char[], אך איננה מסוגלת להעתיק char* ל char*?

כאשר אני מנסה להעתיק char* ל char* הנני מקבל שגיאת הרצה, לדוגמה עבור הקוד הבא:

#include <string.h>
#include <iostream.h>

void main()
{
char *string1="hw";
char *string2="zone";
strcpy(string2, string1);
cout<<string2;
}

תודה מראש, קובי.

פורסם

מערבב C++ עם C ? לא קריטי

בכל מקרה, כדאי להבין מה משמעות ה * שאתה מוסיף... זה מצביע.. צריך להקצות מקום לפני שמשתמשים, אי אפשר להכניס "hw" לתוך מצביע סתם ככה..

אני ממליץ לקרוא על פוינטרים והקצאות מקום.

פורסם
  • מחבר

שתי בקשות לי אליכם:

- האם יש דרך להחזיר ערך של char[] בפונקציה, ולא char*?

- אשמח אם מישהו יואיל בטובו לתקן את קטע הקוד.

בתדוה מראש, קובי.

פורסם

בגדול char * ו char [] אותו דבר(כשאתה שולח את זה לפונ).

תנסה להשתמש ב- strdup במקום strcpy.

string1= strdup(string2);

פורסם

תקנתי את מה שכתבת

int main( void )
{
char string1[]="hw";
char string2[]="zone";
strcpy(string2, string1);
cout<<string2;
return 0;
}

פורסם

אוקי, כמה דברים:

1. char* ו-char[] הם אותו דבר מבחינת המהדר (כל פונקציה שמקבלת אחד יכולה גם לקבל את האחר). ההבדל היחיד הוא ש-char* נועד למערכים דינמיים ו-char[] נועד למערכים סטטיים.

2. אי אפשר לעשות char* string1="hw", כי המחרוזת "hw" היא קבועה (const). מה שאתה מנסה לעשות הוא שמצביע שאינו const יצביע ל-const, וזה אסור. מה שאתה יכול לעשות זה const char* string1="hw" (ואז string1 יהיה קבוע, כלומר לא תוכל להעתיק לתוכו באמצעות strcpy).

3. כשאתה עושה strcpy, מצביע היעד שלך (המקום אליו אתה מעתיק, לא זוכר איזה משני הארגומנטים זה) חייב להצביע לזיכרון שהקצית מראש (allocate) סטטית (כלומר char str[10]) או דינמית (כלומר char* str=new char[10]). הוא לא יכול להצביע לקבוע (כמו המחרוזת "hw" שרשמת), כי אי אפשר לכתוב לתוכו.

פורסם
  • מחבר

תודה על העזרה.

לפניכם עוד שאלה:

יצרתי Default Constructor עבור, לדוגמה, Student, בצורה הנ"ל:

Student(char name[MAX_LETTERS]=NULL, char username[MAX_LETTERS]=NULL, char password[MAX_LETTERS]=NULL, int year=0, long course_numbers[5]=NULL, int grades[10]=NULL)

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

בנוסף, האם יש דרך לאתחל את המערכים, לדוגמה course_numbers, בערך קבוע, כמו 1 (כלומר, כל איברי המערך יושוו ל 1), כבר בהצהרה או בשורת האתחול?

חשבתי על course_number[5]={1, 1, 1, 1, 1}, לא הלך.

תודה מראש על ההתייחסות ועל העזרה, קובי.

פורסם

אולי באמת כדאי שתחזור ותלמד מערכים ופיינטרים

וכן אפשר לאתחל את כל המערך ברגע ההגדרה לדוגמא כדי לאתחל את כל אבריו של מערך בגודל 5:

char a[5]={0}

אפשר גם לאתחל כל אחד בניפרד:

int a[5]={1,2,3,4,5}

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

int a[]={1,2,3,4,5}

פורסם

אוף אתכם.

לא מעבירים מערכים על ה- stack!

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

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים