split מכרוזת

Gnosiophobia

New member
split מכרוזת

שלום לכולם. יש לי שורה שמורכבת מ-7 מילים, אני צריך הלהפריד בין המילים, כלמאר אני צריך להכניס כל מילה למשתנה אחר, או למערך... אני צריך פקודה שדומה ל split בjava או ב perl, יש כזה דבר? תודה.
 

stac

New member
explode php source

http://lxr.php.net/source/php-src/ext/standard/string.c#762
 

linuxius

New member
strstr

1) תשתמש ב-strstr תמצא את תו ההפרדה (הכתובת שלו) ואז תשתמש במחרוזת עד אליו. 2)אחר כך תתקדם תו אחד וחזור על 1
 

Gnosiophobia

New member
טוב, זה קצת

מסובך מה שאתם אומרים, הגעתי לזה:
char* a = strchr(line, ' '); *a = '\00';​
ב line עכשיו יש את המילה הראשונה, אני יעביר אותה למשתנהאחר, מה אני יכול לעשות עכשיו?
 

the new L

New member
אם זה C++

אז פשוט תעשה משהו כזה:
string yourstring = "bla bla2 .... "; istringstream myStream(yourstring); vector<string> vStr; while (myStream) { string tempString; myStream >> tempString; vStr.push_back(tempString); }​
הכי פשוט, הכי אלגנטי, כמו שסי++ נועדה להיות :)
 

the new L

New member
מתקדם ../images/Emo35.gif

להפך, הקוד שאני העלתי הרבה יותר פשוט להבנה מאשר שימוש ב strstr וכל מיני דברים כאלה. הקוד הזה עושה את התכלס ולא מתעסק בדברים כמו זיכרון. אמנם יש לו קצת overhead אבל אני בטוח שבשביל השימוש שלך הוא עדיף מאשר לעבוד עם *char
 

eyalbd

New member
תשתמש ב-strtok

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

Gnosiophobia

New member
OK התקדמות:

מהדוגמה במהדר העתקתי משהוא כזה:
void chackLine(char line[]) { char *p; p = strtok(line, " "); if (p) printf("%s - \n", p); p = strtok(NULL, ","); if (p) printf("%s , \n", p); }​
קודם המילה הראשונה בשורה נכנסת לP אפשר לעבוד עליה בניפרד, זה טוב. אבל אני לא מצליח להפריד את 6 המילים האחרות, כל השורה נכנסת לP, מה אני צריך לעשות?
 

Gnosiophobia

New member
הצלחתי!

למראת שלא רציתי לעשות ככה כי זה מסובך ולא ממש יפה:
void chackLine(char line[]) { char *p, *a, *b, *c, *d, *e; p = strtok(line, " "); if (p) printf("%s - \n", p); p = strtok(NULL, ","); a = strtok(p, " "); if (a) printf("%s - \n", a); a = strtok(NULL, ","); b = strtok(a, " "); if (b) printf("%s - \n", b); a = strtok(NULL, ","); if (a) printf("%s , \n", a); }​
כאילו צריך להמשיך עבור כל אחד מששת המצביעים... עם למישהוא יש פתרון יותר טוב אשמח לשמוע תודה.
 

eyalbd

New member
למה שלא תעשה את זה בלולאה?

הנה לך דוגמא מלאה:
#include <string.h> #include <stdio.h> // split the line // return the number of words // int split_line(char line[], char* results[], const char* separator) { int index; char* p; index = 0; if ((p = strtok(line, separator)) != NULL) { results[index] = p; do { index++; p = strtok(NULL, separator); results[index] = p; } while (p != 0); } return index; } // Example // int main() { int num_words; char* argz[100]; char line[] = "Hello world today is saturday\tJan \t2004"; num_words = split_line(line, argz, " \t"); if (num_words > 0) { int i; printf("Number of words = %d\n", num_words); for (i = 0; i < num_words; ++i) printf("Word %d: %s\n", i + 1, argz); } return 0; }
 
למעלה