עבור לתוכן

בעיה עם char* ב C

Featured Replies

פורסם

כתבתי קוד שמחזיר פוינטר של char :



char* two_num(int num){

int m=num/10;

int n=num%10;

char *c;

switch(m)

{

case 2:c="twenty ";break;

case 3:c="thirty ";break;

case 4:c="forty ";break;

case 5:c="fiftn ";break;

case 6:c="sixty ";break;

case 7:c="seventy ";break;

case 8:c="eighty ";break;

case 9:c="ninety ";break;

break;

}



return c;

}

אני אמור לקבל מספר ולכתוב אותו באותיות.

יש פונקציה נוספת שמוצאת את המספרים 1-10 ומחזירה *char רציתי לדעת אם יש דרך לחבר בין שניהם?

אני רוצה להמשיך לכתוב את הפונקציה שאם ספרת האחדות גדולה מ0 אז להחזיר char שמייצג אותם.

שאם אני מכניס למשל 25 יהיה לי c="twenty five"

פורסם

כמובן, באמצעות פונקציות לטיפול במחרוזות:

http://www.cplusplus.com/reference/clibrary/cstring/strcat

http://www.cplusplus.com/reference/clibrary/cstring/strcpy

שים לב אבל לדבר מאוד חשוב: הפונקציה strcat מקבלת שתי מחרוזות (דהיינו שני מערכים של char) ומשרשרת את השנייה לסוף הראשונה. בשביל זה צריך שני דברים: שיהיה אפשר לכתוב למערך הראשון, ושיהיה מספיק מקום לשרשור שלהן (כלומר לפחות סכום אורכי המחרוזות + 1). לדוגמה, בקוד של two_num שנתת המחרוזת שחוזרת היא מחרוזת קבועה בזכרון, ואי אפשר לכתוב עליה (קומפיילרים מסוימים אפילו יכריחו את ערך ההחזרה של הפונקציה להיות *const char במקרה כזה). תצטרך קודם כל להעתיק את התוצאה למערך חדש שאליו אתה כן יכול לכתוב.

פורסם
  • מחבר

רק בשביל לדעת שהדרך שלי נכונה....

המטרה של התכנית זה לקבל מספר מ 1-99 ולהחזיר אותו במילים בשביל שב main אני יוכל או להכניס אותו לקובץ או בפלט הסטנדרטי

בקובץ(תוכנית) שמקבל את המספר והופך אותו למילים יש פונקציה שבודקת את המספר ושולחת אותו לפונקציה המתאימה בשביל להפוך אותו למילים.

מה שעשיתי זה 3 פונקציות שאחת לאחדות אחת ל 11-19 ואחת למספרים 20,30,40,50,60,......ובפונקציה הזאת אני בודק אם קיים מספר אחדות ואם כן אני צריך לחבר אותם.

הפונקציה שבודקת לאן לשלוח את המספר מחזירה *char

עכשיו השאלה שלי אם זאת הדרך הנכונה לעשות דבר כזה כי אני רוצה בסופו של דבר לשלוח *char ל main ואני דיי נתקע עם הקטע של להוסיף כיתוב ב two_num כי אני מצליח לחבר אבל לא להחזיר את זה בתור c* (אני מחזיר את זה בתור c* אבל שאני מנססה להדפיס זה מדפיס לי ג'יבריש) ושאר הפונקציות מדפיסות בסדר.

פורסם

שים לב שאם אתה רוצה להחזיר char* אתה צריך לשלוח לפונקציה מצביע אליו, כלומר char**.

פורסם

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

תסתכל על הדוגמאות של strcat ו-strcpy שנתתי לך ותבין.

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

char* foo() {
char buffer[80];
strcpy(buffer, "Hello!");
return buffer;
}

הוא אסור בתכלית האיסור, כי המערך buffer יימחק ברגע שאתה יוצא מהפונקציה.

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

פורסם
  • מחבר

אוקיי אז פשוט להגדיר מערך buffer מחוץ לפונקציה ואז אחרי שהוא מכיל את 2 המספרים לעשות c=buffer ולהחזיר את c?

אני לומד כרגע c בפתוחה ולמדתי לפני ג'אווה....ככה שאני לא רגיל לפויינטרים...

פורסם

תעשה שהפונקציה מקבלת את ה-buffer, כותבת לתוכו ולא מחזירה כלום. עדיף להימנע מלהגדיר משתנים גלובליים (משתנים שמוגדרים מחוץ לפונקציה). מי שקורא לפונקציה (לדוגמה, ה-main) הוא זה שיגדיר את ה-buffer.

כמובן תדאג שה-buffer יהיה בגודל שיספיק בשביל המחרוזת הארוכה ביותר שלך (נגיד, 100 זה בטוח יספיק).

פורסם
  • מחבר

אוקיי תודה, אני אנסה כמו שאתה מציע.

פורסם
  • מחבר

יש לי בעיה... כאשר אני מקבל בקלט רווח או אות אז זה מחזיר לי 0

נסיתי להשתמש ב strtol אבל עדיין יש בעיות עם הרווח. זה הקוד:



fgets(numbers,100,stdin);

c=strtok(numbers," ");

while(c!=NULL){

num=atoi(c);

printf("%s",num_chek(num));

c=strtok(NULL," ");

}

ארכיון

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

דיונים חדשים