עבור לתוכן

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

Featured Replies

פורסם

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

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

פורסם

1. את יוצרת משתנה זמני - TEMP.

2. אפשר לקלוט מהם נותנים שנשלחו, בהתאם לתרגיל.

פורסם
  • מחבר

1. אבל מאיזה סוג המשתנה? איך מצהירים על מערך מסוג char דו מימדי (כי כל תא צריך להכיל מילה)? ובאיזה גודל?

פורסם

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

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 יש חבילות כאלה, אבל זה כנראה פחות נוח)

פורסם
  • מחבר

ככה צריך לשחרר את הזכרון?


for (int i = 0 ; i < num_words ; ++i)
{
free(temp[i]);
}

free(temp(;

פורסם

איך המרצה שלי באוניברסיטה אמר? הפונקציה הזאת היא מהשטן!!!! :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

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

פורסם

Not my cup of tea

ארכיון

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

דיונים חדשים