שאלה

matliv

New member
שאלה

בחיה הראשונה הוא עושה מה שהוא צריך אבל בחיה השנייה הוא לא נותן לי להכניס את שם החיה. כלומר הוא כותב ":insert name of animal" אבל אז מיד קופץ שורה ועובר למספר הרגליים (כאילו לחצתי enter). למה?
#include <iostream.h> struct animal_s { char name[30]; int legs; float tail_length; }; void set_animal(animal_s*); void show_animal(animal_s*); int main() { animal_s animal_1, animal_2; set_animal(&animal_1); set_animal(&animal_2); show_animal(&animal_1); show_animal(&animal_2); return 0; } void set_animal(animal_s *a) { cout<<"\ninsert name of animal: "; cin.getline( a->name, 30 ); cout<<"\ninsert number of legs: "; cin>>a->legs; cout<<"\ninsert length of tail: "; cin>>a->tail_length; } void show_animal(animal_s *b) { cout<<"\n\nThe animal: "<<b->name; cout<<"\nIt has "<<b->legs<<" legs, and its tail is "<<b->tail_length<<" ft long."; }​
 

דריזט

New member
תיאור הבעיה + פתרון

בניגוד ל cin שמתעלמת מתווים 'לבנים' (רווח, טאב, שורה חדשה), getline 'אוכלת' את כל התווים עד לתו הסיום (שורה חדשה בברירת מחדל) וכאן טמונה הבעיה. זהו מהלך הקלט של התוכנית: הבאפר ריק; הפונקציה getline נקראת וקולטת את כל מה שתכניס עד סוף השורה (בהנחה שלא עברת את ה 30 תווים), את סוף השורה היא מוציאה מהבאפר - הבאפר שוב ריק. cin נקראת, היא מדלגת על תווים לבנים עד למספר, מעבדת אותו ומשאירה בבאפר את מה שלא נגעה בו - תו סוף השורה (מלחיצת האנטר). שוב נקראת cin, היא מדלגת על תו סוף השורה שנשאר עד שהיא מגיעה למספר, מעבדת אותו ושוב משאירה תו סוף שורה... שמבלבל את getline בקריאה הבאה. הפתרון הוא לקרוא ל cin.ignore() לפני שקוראים ל getline, כדי לדלג מעל התו האחרון. אגב, המשתנים בהגדרת הפונקציה הם פרטיים לפונקציה - שני הפוינטרים, הן של set_animal והן של show_animal יכולים להיקרא a.
 
למעלה