עבור לתוכן

פונקצייה לחיפוש צמד מילים דומות בסטרינג

Featured Replies

פורסם

כמו שהכותרת אומרת אני מחפש פונקצייה בישביל למצוא במשפט שהמשתמש מכניס (נכנס לסטרינג) צמד מילים צמודות שהן שוות ואז לדרוס אותן

למשל:

hello my my name is david

יהפוך לאחר הפעלת הפונקצייה ל

hello my name is david

שפת סי כמובן :)

אגב זה אמור לפעול בלולאה לדעתי כי הוא יחפש בכל המשפט צמד מילים דומות...

אשמח לקבל עזרה

פורסם

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

פורסם

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

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

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

אתה צריך לעבור כל כל המערך שלך ולחפש את התו של הרווח(32), אתה מעתיק את כל התווים מתחילת המחרוזת ועד הרווח, לאיבר הראשן ברשימה, ולאחר מכן את כל התווים בין תו הרווח לתוו רווח הבא או לסוף המחרוזת(0\).

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

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

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

פורסם

נכון, טיפול במחרוזות ב-C זה זוועה. אבל זה עדיין אפשרי.

לדוגמה, דרך אפשרית לעשות את זה, בהנחה שהמחרוזת מכילה רק מילים עם רווחים בודדים, היא קודם כל לעבור על כל המחרוזת ולהחליף את כל הרווחים ב-'0\'. כמובן צריך לשמור בצד את מספר המילים שעברנו עליהן במחרוזת (נסמן זאת ב-n).

אחר כך מחזיקים שני מצביעים - אחד לתחילת המחרוזת המקורית (נקרא לו p) ואחד לתחילת המילה השנייה במחרוזת (נקרא לו q) , שהוא בדיוק p+strlen(p)+1.

עכשיו הלולאה דווקא די פשוטה:

for (i = 0 ; i < n-1 ; i++) {
if (strcmp(p, q) != 0) {
// some code to concatenate p to a buffer
}
p = q;
q += strlen(q) + 1;
}
// concatenate p to the buffer

אפשר להימנע מלהחליף את כל הרווחים ב-'0\' אם נחליף את strcmp ו-strlen בפונקציות שמתייחסות לרווח כאילו הוא סוף המילה.

פורסם

אם אתה יודע מראש כמה מילים יהיו לך (ואפשר גם אם זה מספר משתנה, למרות שצריך להתחכם מאוד בקטע של הvarargs) - אפשר להשתמש בsscanf בשביל לעשות parsing נורמלי.

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

פורסם

אתם יודעים, יש tokernizer מאוד קל לשימוש ב-C שנקרא strtok.

הבעיה היא שהוא לא thread-safe אבל במקרה שלנו זה לא בעיה.

פורסם

ע"י שמירת 2 אינדקסים ושינוי הרווח ל- 0, אתה יכול לעשות את זה בצורה ממש פשוטה ויפה.

ארכיון

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

דיונים חדשים