עבור לתוכן

קליטת מילה מתוך שורה שלמה של מילים c++

Featured Replies

פורסם

שלום לכולם

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

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

מקווה שהסברתי את עצמי מספיק טוב

תודה לעוזרים.

פורסם

אם אתה עובד ב- c++ כדאי שתסתכל בפונקציות get ו- getline של cin (כלומר של istream)

פורסם

לגבי קליטת שורה - תעשה מה ש-Boomerang כתב.

לגבי קליטת מלים, אם אתה משתמש ב-string של C++, STL, אז יש פונקציה בשם find_first_of - בכדי למצוא את האות שמפרידה בין המלים שלך (למשל, רווח - " "). ואז תשתמש בפונקציה substr כדי לקבל את המילה מתוך השורה, וגם לקצץ את השורה ולהשאר עם מה שנותר.

פורסם
  • מחבר

ניסיתי לעשות פונקציה שקולטת את השורה ואת המיקום בשורה ואז משמה היא מוציאה לי את המילה ומחזירה אותה

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


#include<iostream.h>
#include<string.h>



char take_mila(char shora[],int pos)
{
int pos_m=0;
char mila[20];
if(shora[pos]=' ')
return 0;
else
{

while(shora[pos]!=' '||shora[pos]==NULL)
{
mila[pos_m]=shora[pos];
pos++;
pos_m++;
}

return(mila[20]);
}

}


int main()
{
char word[100],mila[20];
int mikom=0;
cout<<"put mila"<<endl;
cin>>word;
strcpy(mila,(take_mila(word,mikom)));
cout<<mila<<"the word is"<<endl;


return 0;
}



פורסם

אם אתה רוצה ליצור רשימה של המילים האלה, הייתי מציע לך ליצור מערך מצביעים char *, ובכל מקום שאתה רואה רווח במחרוזת שלך, תשים שם \0 ותצביע למקום שאחרי.

פורסם
  • מחבר

אם אתה רוצה ליצור רשימה של המילים האלה, הייתי מציע לך ליצור מערך מצביעים char *, ובכל מקום שאתה רואה רווח במחרוזת שלך, תשים שם \0 ותצביע למקום שאחרי.

זה אומר שאני אשים NULL בכל מקום שיש בו רווח ??

מה הטעות שלי שם??

פורסם

כן(אבל רק בגלל של \0 וNULL יש אותו ערך).

פורסם

ניסיתי לעשות פונקציה שקולטת את השורה ואת המיקום בשורה ואז משמה היא מוציאה לי את המילה ומחזירה אותה

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


#include<iostream.h>
#include<string.h>



char take_mila(char shora[],int pos)
{
int pos_m=0;
char mila[20];
if(shora[pos]=' ')
return 0;
else
{

while(shora[pos]!=' '||shora[pos]==NULL)
{
mila[pos_m]=shora[pos];
pos++;
pos_m++;
}

return(mila[20]);
}

}


int main()
{
char word[100],mila[20];
int mikom=0;
cout<<"put mila"<<endl;
cin>>word;
strcpy(mila,(take_mila(word,mikom)));
cout<<mila<<"the word is"<<endl;


return 0;
}



אתה לא יכול להחזיר mila[20] כי אין דבר כזה.

אתה צריך להחזיר מצביע לתחילת המחרוזת החדשה שלך.

אני מציע לך לנסות להחזיר את אורך המילה ולא תו.

int fun(char *s, int pos)

{

for(;s[pos] && s[pos]!=' ';pos++);

return pos;

}

הפונ הזו מקבלת מחרוזת ומיקום ראשוני, ומחזירה לך את המיקום של הרווח הבא אחרי המיקום.

אם אין רווח, הפונ מחזירה את אורך המחרוזת.

פורסם

יש גם את הפונקציה הסטנדרטית strtok שנותנת לך לחתוך string למילים.

למען האמת, אם תשתמש באופרטור << של cin אז הוא יקרא לך כל מילה בנפרד. יותר פשוט, לא?

פורסם
  • מחבר

יש גם את הפונקציה הסטנדרטית strtok שנותנת לך לחתוך string למילים.

למען האמת, אם תשתמש באופרטור << של cin אז הוא יקרא לך כל מילה בנפרד. יותר פשוט, לא?

אפשר קצת יותר הסבר מה זאת אומרת אם אני אשתמש באופרטור << של cin איך בדיוק להשתמש בזה?

ואם אפשר קצת יותר הסבר על הפונקציה strtok איך היא עובדת בדיוק??

פורסם

על strtok אתה מוזמן לקרוא ב- MSDN.

באופרטור << אתה יכול להשתמש למשל ע"י:



char buffer[MAX_INPUT];
std::cin>>buffer;

כאשר MAX_INPUT זה אורך יותר גדול ממה שהמשתמש יכול להכניס. (יש כאן בעיית buffer overflow ובגלל זה הצעתי קודם את פונקציות get של istream)

פורסם

אפשר לנסות את זה?


void output_words(char str[])
{
for(int i=0; str[i]!='\n'; i++)
{
if(isspace(str[i]))
{
cout << endl;
eatSpaces(str, i);
}
else
cout << str[i];
}
}

עבור על כל המערך, אם נתקלת ברווח (isspace()) תוכל את כל הרווחים (eatSpaces() פונ' שהינך אמור לבנות) אם התא לא רווח הדפס אותו.

ארכיון

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

דיונים חדשים