פורסם 2009 במרץ 716 שנים אם אני רוצה לקלוט מחרוזת מהמשתמש ולפרק אותה למילים בעזרת STRTOK- איך אני מצהירה על המשתנה שישמור את המילים?למה משמשים int argc, char* argv[] -האם אפשר לשמור בהם נתונים או רק לקלוט מהם את הנתונים שנשלחו לתכנית?
פורסם 2009 במרץ 716 שנים 1. את יוצרת משתנה זמני - TEMP.2. אפשר לקלוט מהם נותנים שנשלחו, בהתאם לתרגיל.
פורסם 2009 במרץ 816 שנים מחבר 1. אבל מאיזה סוג המשתנה? איך מצהירים על מערך מסוג char דו מימדי (כי כל תא צריך להכיל מילה)? ובאיזה גודל?
פורסם 2009 במרץ 816 שנים או שתצהירי על מערך דו מימדי סטטי:char temp[10][20];(כשכמובן במקום 10 ו-20, שימי את מספר המחרוזות ואת אורך כל מחרוזת צפויה)החסרון של זה הוא שאת צריכה להניח מראש כמה מחרוזות יהיו לך, ומה יהיה האורך המקסימלי שלהן.אופציה שנייה היא להגדיר את המערכים באופן דינמי, באמצעות malloc. גם במקרה הזה את צריכה לדעת מראש כמה מחרוזות יהיו לך, וכמה מקום את צריכה לכל מחרוזת (אבל אפשר לחשב את זה בזמן ריצה).למדת כבר malloc?
פורסם 2009 במרץ 816 שנים מחבר אני יודעת להשתמש בפונקציה malloc להצהיר על מערך חד מימדי.לספור את גודל המערך אפשר שבלולאה יהיה מונה לספירת הרווחים, ואם אחליט על גודל קבוע למילה (לא יותר מ10 תוים)- איך אני מצהירה על זה?
פורסם 2009 במרץ 816 שנים יש שתי דרכים ליצור מערך דו מימדי באופן דינמי. דרך אחת היא ליצור מערך אחד גדול ואז לחלק אותו לתתי מערכים, ודרך שנייה היא ליצור מערך של מערכים.ככה מממשים את הדרך השנייה:קודם כל, המשתנה שלך הוא מצביע למצביע (כי את רוצה מערך של מערכים):char** temp;יוצרים מערך של מצביעים:temp = (char**)malloc(num_words * sizeof(char*));כאשר num_words כמובן הוא משתנה שיחזיק את מספר המחרוזות שאת רוצה.עכשיו, יש לך מערך של מצביעים - את צריכה שכל אחד מהם יצביע למערך חדש, כלומר:for (int i = 0 ; i < num_words ; ++i){ temp[i] = (char*)malloc(length * sizeof(char));}כש-length הוא האורך של כל מחרוזת שאת רוצה להקצות.שימי לב כמובן שכשאת משחררת את המערך, צריך לבצע free על כל אחד מאיברי המערך, ורק אחר כך לעשות free על המערך עצמו.
פורסם 2009 במרץ 816 שנים מחבר בעיה: מתי אני מצהירה על המערך הזה? <יש לי לולאה שעוברת על המחרוזת שנקלטה כדי לפרק אותה למילים, כדי שאוכל לשמור את המילים במערך - אני צריכה להצהיר עליו לפני הלולאה, אבל - אז מתי אני סופרת כמה מילים יש לי? לעשות פעמיים את הלולאה?>
פורסם 2009 במרץ 816 שנים כן, אין דרך הרבה יותר חכמה מזה. דרך אחרת היא כל הזמן להגדיל את המערך באופן דינמי (באמצעות realloc), אבל זה סתם מסורבל.(אם היית עובדת ב-++C אז היית יכולה לעבוד עם מחלקות שמנהלות רשימות דינמיות, שגדלות במקרה הצורך. אני מניח שגם ב-C יש חבילות כאלה, אבל זה כנראה פחות נוח)
פורסם 2009 במרץ 916 שנים מחבר ככה צריך לשחרר את הזכרון?for (int i = 0 ; i < num_words ; ++i){ free(temp[i]);}free(temp(;
פורסם 2009 במרץ 916 שנים איך המרצה שלי באוניברסיטה אמר? הפונקציה הזאת היא מהשטן!!!! ולראיה: BUGS The System V strtok(), if handed a string containing only delimiter char- acters, will not alter the next starting point, so that a call to strtok() with a different (or empty) delimiter string may return a non-NULL value. Since this implementation always alters the next start- ing point, such a sequence of calls would always return NULL. וגם, כמובן שהיא לא תומכת ב multi threading
פורסם 2009 במרץ 1016 שנים איך המרצה שלי באוניברסיטה אמר? הפונקציה הזאת היא מהשטן!!!! ולראיה: BUGS The System V strtok(), if handed a string containing only delimiter char- acters, will not alter the next starting point, so that a call to strtok() with a different (or empty) delimiter string may return a non-NULL value. Since this implementation always alters the next start- ing point, such a sequence of calls would always return NULL. וגם, כמובן שהיא לא תומכת ב multi threading תאר לך שהיית צריך לממש את הפונקציה הזו באסמבלי...
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.