שפת סי- strtok ועוד שאלה: - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

שפת סי- strtok ועוד שאלה:


נעמה.

Recommended Posts

אם אני רוצה לקלוט מחרוזת מהמשתמש ולפרק אותה למילים בעזרת STRTOK- איך אני מצהירה על המשתנה שישמור את המילים?

למה משמשים int argc, char* argv[] -האם אפשר לשמור בהם נתונים או רק לקלוט מהם את הנתונים שנשלחו לתכנית?

קישור לתוכן
שתף באתרים אחרים

או שתצהירי על מערך דו מימדי סטטי:

char temp[10][20];

(כשכמובן במקום 10 ו-20, שימי את מספר המחרוזות ואת אורך כל מחרוזת צפויה)

החסרון של זה הוא שאת צריכה להניח מראש כמה מחרוזות יהיו לך, ומה יהיה האורך המקסימלי שלהן.

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

למדת כבר malloc?

קישור לתוכן
שתף באתרים אחרים

אני יודעת להשתמש בפונקציה malloc להצהיר על מערך חד מימדי.

לספור את גודל המערך אפשר שבלולאה יהיה מונה לספירת הרווחים, ואם אחליט על גודל קבוע למילה (לא יותר מ10 תוים)- איך אני מצהירה על זה?

קישור לתוכן
שתף באתרים אחרים

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

ככה מממשים את הדרך השנייה:

קודם כל, המשתנה שלך הוא מצביע למצביע (כי את רוצה מערך של מערכים):

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 על המערך עצמו.

קישור לתוכן
שתף באתרים אחרים

בעיה: מתי אני מצהירה על המערך הזה?

<יש לי לולאה שעוברת על המחרוזת שנקלטה כדי לפרק אותה למילים, כדי שאוכל לשמור את המילים במערך - אני צריכה להצהיר עליו לפני הלולאה, אבל - אז מתי אני סופרת כמה מילים יש לי? לעשות פעמיים את הלולאה?>

קישור לתוכן
שתף באתרים אחרים

כן, אין דרך הרבה יותר חכמה מזה. דרך אחרת היא כל הזמן להגדיל את המערך באופן דינמי (באמצעות realloc), אבל זה סתם מסורבל.

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

קישור לתוכן
שתף באתרים אחרים

איך המרצה שלי באוניברסיטה אמר? הפונקציה הזאת היא מהשטן!!!! :angryfire:

ולראיה:

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

קישור לתוכן
שתף באתרים אחרים

איך המרצה שלי באוניברסיטה אמר? הפונקציה הזאת היא מהשטן!!!! :angryfire:

ולראיה:

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

תאר לך שהיית צריך לממש את הפונקציה הזו באסמבלי...

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...