אוקיי, אז הייתי הולך על זה ככה:
רעיון ראשון
עושים משהו כזה:
- מחלקים את המשפט למלים
- ממיינים את המילים
- בונים משפט חדש
הפונקציות יראו בערך ככה:
קוד:
#include <stdlib.h>
#include <stdio.h>
int compare_words(const void* const a, const void* const b) {
// trivial...
}
void explode(const char * const str, const char delim, char *** arr, size_t * const count) {
// too annoying to implement
}
void lexico(const char * const src, char * const dst) {
char** words_arr = 0;
size_t words_cnt = 0;
size_t i = 0;
size_t cur_loc = 0;
explode(src, ' ', &words_arr, &words_cnt);
qsort(words_arr, words_cnt, sizeof(words_arr[0]), &compare_words);
//copy word words_arr[i] into dst[cur_loc]
}
int main() {
char user_input[256*256];
char ordered[sizeof(user_input)];
printf("Enter something: ");
fgets(user_input, sizeof(user_input), stdin);
lexico(user_input, ordered);
printf("\r\nAnd the results are......\r\n\r\n%s\r\n", ordered);
return 0;
}
שים לב שהחלק המעצבן זה הפונקציה explode. זה גרוע במיוחד, כי אתה צריך שהפונקציה explode תקצה זיכרון למספר לא ידוע של מערכים קטנים של char (מערך לכל מילה), שהגודל של כל אחד מהם לא ידוע... זה די מעצבן.
מספיק מעצבן ככה שלא עשיתי את זה. אתה יכול לנסות אם בא לך.
עכשיו אני הולך להמשיך ולפתור את זה עד הסוף. אם אתה לא רוצה פיתרון, אלא לחשוב על זה לבד, הפסק לקרוא כאן, ותמשיך אחרי שתחשוב על זה.
רעיון שני
בשלב הזה, הייאוש מוביל אותנו לחשוב על דבר כזה.
הפונקציה explode לא באמת חייבת להקצות זיכרון חדש לכל הסיפור הזה.
נניח שיש לנו מערך אחד של char שנראה ככה:
"abcd efgh ijkl mnop qrs tu vwx yz"
אנחנו רוצים לקבל רשימה של מצביעים, שכל אחד מהם מצביע למילה אחת בכל הסיפור הזה.
בעצם, כבר כמעט יש לנו את המילים המפורקות. צריך רק להחליף בכל מקום רווח ל-NUL ככה:
"abcd\0efgh\0ijkl\0mnop\0qrs\0tu\0vwx\0yz"
עכשיו צריך רק לסדר רשימה של מצביעים לנקודות האלה. זה כבר לא כל-כך קשה.
הבעיות היחידות שיש לנו עם הרעיון הזה, זה שלא ברור מי מנהל את הזיכרון הזה. הפונקציה explode מקצה את המקום למחרוזת שבה הרווחים מוחלפים ב-NUL-ים
וגם מערך למצביעים לאזורים הנכונים במחרוזת הזאת. מי ישחרר את המחרוזת הגדולה? איפה בכלל שמורה הכתובת שלה? עכשיו צריך לטפל בזה...
אנחנו עוד לא סיימנו, אבל כרגע אין לי כח להמשיך לכתוב...