السلام عليكم ورحمة الله وبركاتة
لدي مشكلة في فهم امر cin.getline فهل اجد شرحاً لها
علماً انني اريد الاستفادة منها لادخل نص وليكون من خمس اسطر ..
فما الطريقة
السلام عليكم ورحمة الله وبركاتة
لدي مشكلة في فهم امر cin.getline فهل اجد شرحاً لها
علماً انني اريد الاستفادة منها لادخل نص وليكون من خمس اسطر ..
فما الطريقة
السلام عليكم
اخي العزيز شكراً على ردك السريع ولكن هل توضح لي اكثر لني لكي شرح ولكني لم افهمه
cin.getline
Read line of text
cin.getline( array, size, delimiter );
Copies input into specified array until either
One less than size is reached
delimiter character is input
Example
char sentence[ 80 ];
cin.getline( sentence, 80, '\n' );
cin.getline( array, size, delimiter );
على فرض ان array هو من نوع char[] فالدالة تقرأ سطرا من الدوس (سطرا يدخله المستخدم) و يخزنه في array
و الباقي كما قال البشمهندس
اذا قلنا ان انه يخزن في array اذا اردت تخزين سطر كم اضح حجم array
size ماذا تحني عدد الاحرف ...
اظن ان حجم الـ array او عدد الحروف اللتي سيدخلها المستخدم غير معلوم, لذلك عليك ان تحدد حجما للـ array بحيث يكون اكثر مما تتوقع, مثلا 256 ممكن يكون كافي, و لكن قد تصبح هناك مشكلة اذا قام المستخدم بادخال عدد من الحروف اكبر من ذلك, لان البرنامج سيكتب خارج نطاق المصفوفة, مما قد يسبب مشاكل, لذلك نقوم بتمرير حجم المصفوفة الى الدالة لكي تتوقف عندها (حتى لو كان هناك مزيد من المدخلات)
فالـ size يجب ان يكون هو حجم الـ array.
السلام عليكم
اشكر الاخوه على هذا التفاعل مع الموضوع وسرعة الرد ولكن هل يمكن توضيح *char لني لابد من احدد حجم array
موضوع ارجوا ان اجد له حلاً
تم تعديل هذه المشاركة بواسطة gareb في 18 مايو 2005 في 22:43
لا تستطيع استخدام char * (الا اذا كانت تشير الى مصفوفة).
حدد مصفوفة بحجم معين, ثم اقرأ على الشاشة منها.
#include <iostream>
using namespace std;
int main()
{
char line[300];
cin.getline( line, 300 );
cout << "You entered: " << line << endl;
return 0;
}اذا كنت ممن يحبون توفير ال memory فاستخدم هذا الكود
int n =8; char* text = new char(n); cin.getline(text, 100); cout<<text<<endl;
و لاحظ انه هكذا عند استخدام *char فانه لا يحجز المساحة و انما ينوي حجزها اذا تم استخدامها فاذا تم استخدام جزء منها فانه يحجز هذا الجزء فقط و لا يحجز كل المساحة و هذا يوفر في ال Memory
Sr. Software Development Engineer
Hulu, LLC
My Blogs
char* text = new char[n];
يجب استخدام اقواس المصفوفة .. [ ]
تقنيا لا يوجد فرق بين هذا و
char text[8];
لأنك في كلا الحالتين تحدد الحجم وقت الـ compiler time, و طريقة new تبعها تعقديات لا نحتاج لها اذا كانت المشكلة التي نتعامل معها بسيطة ..
يا اخي واحد يسألك عن cin.getline, ترمي عليه pointers و dynamically allocated arrays !!!! :blink:
اقتباسو لاحظ انه هكذا عند استخدام *char فانه لا يحجز المساحة و انما ينوي حجزها اذا تم استخدامها فاذا تم استخدام جزء منها فانه يحجز هذا الجزء فقط و لا يحجز كل المساحة و هذا يوفر في ال Memory
ماذا تقصد؟ و كيف يوفر هذا اي مساحة؟ بالعكس, ممكن يسبب memory leak اذا نسيت ان تعمل له delete, و على كل حال فطريقة [char text[8 لا تقوم بحجز مساحة زائدة, بل تقوم بحجز المساحة المطلوبة فقط. فأين التوفير في الذاكرة؟
تم تعديل هذه المشاركة بواسطة hasan_aljudy في 19 مايو 2005 في 01:02
استخدام الاقواس المربعة او العادية في هذا الاستخدام بالذات لا تختلف و يمكنك ان تجربها اذا لم تصدقني
في حالة استخدام new لا يحجز الMemory في الCompile Time و انما يحجز ما يحتاجه من الذاكرة التي ذكرتها له و ليس كلها اذا لم يستخدمها كلها
استخدام [8]char text يحجز المساحة سواء استخدمها الUser ام لا و لكن باستخدام new فهو لا يحجزها الا عندما يستخدمها الUser و يحجز ما استخدمه الUser فقط
و كمان ياعم ++C من غير ما تعرفPointers يعني مالهاش لازمة يتعلم ++C من اصله
و هناك في الC اساليب اخرى للحصول على الstrings من الUser في الCommand افضل من getline من وجهة نظري مثل gets و scanf و ان كانت gets ابسط بكثير
تم تعديل هذه المشاركة بواسطة bashmohandes في 19 مايو 2005 في 01:36
Sr. Software Development Engineer
Hulu, LLC
My Blogs
جرب
char* text = new char(-1);
و جرب
char* text = new char[-1];
ليسا نفس الشي .. لا أعرف بالظبط ما عمل الأقواس, لكن
char* text = new char(n);
لا تحجز سوى حرف واحد ..
اما ان الكود بعمل, فهو يعمل بالصدفة .. فيالحقيقة انت تكتب خارج نطاق الـ array, يعني تعمل overflow, صحيح انها مرت هنا دون مشاكل, لكنها قد تتسبب في مشاكل في مرات لاحقة.
اقتباسفي حالة استخدام new لا يحجز الMemory في الCompile Time و انما يحجز ما يحتاجه من الذاكرة التي ذكرتها له و ليس كلها اذا لم يستخدمها كلهااستخدام [8]char text يحجز المساحة سواء استخدمها الUser ام لا و لكن باستخدام new فهو لا يحجزها الا عندما يستخدمها الUser و يحجز ما استخدمه الUser فقط
هذا الكلام غير صحيح, في كلا الحالتين يتم حجز المساحة نفسها ..
الفرق انه في حالة استخدام new يتم حجز المساحة في الـ heap, بينما بدونها يتم حجزها في الـ stack.
اذا حصل overflow في الـ stack فستتلخبط الذاكرة كلها (في الحقيقة يتخربط الـ stack) و يتوقف البرنامج عن العمل او يحدث اخطاء رهيبة, بل ويصبح البرنامج قابل للاختراق.
اما اذا عملت overflow في الـ heap في برنامج بسيط مثل هذا, فعلى الأغلب لن يحدث شيء يذكر ..
فيما يتعلق بالبويتنرز, فأنا اقصد انه يبدو لي ان مستوى السائل لا يزال دون هذه الأشياء.
يعني لا تفترض ان السائل اصلا يعرف اي شيء عن البوينترز. طبعا ربما يعرف, و لكن لا داعي ان ترمي عليه اشياء قد تزيده حيرة.
تم تعديل هذه المشاركة بواسطة hasan_aljudy في 19 مايو 2005 في 03:08
انا لا اعرف فيم المناقشة هذه مبادئ و عدم معرفتك بها لا يلغيها
استخدام new هو الطريقة المثلى لعمل Dynamic Allocation في ال ++C و هي بديلة لعائلة malloc التي تستخدم في ال C
و كلمة Dynamic Allocation تاتي من عدم حجز المساحة في الCompile Time و لكن المساحة تتحدد و تحجز في ال RunTime و الدليل على هذا انك لا يمكنك ان تفعل هذا
char text[n]
حيث n هي variable لانه يجب ان يعرف القيمة الحقيقية للمساحة ليحجزها في ال CompileTime
و لكن يمنكنك ان تفعل هذا
char* text = new char[n];
و هذا لانه لا يحجز القيمة في الCompile time و انما في الRuntime
]اقتباسلفرق انه في حالة استخدام new يتم حجز المساحة في الـ heap, بينما بدونها يتم حجزها في الـ stack.اذا حصل overflow في الـ stack فستتلخبط الذاكرة كلها (في الحقيقة يتخربط الـ stack) و يتوقف البرنامج عن العمل او يحدث اخطاء رهيبة, بل ويصبح البرنامج قابل للاختراق.
اما اذا عملت overflow في الـ heap في برنامج بسيط مثل هذا, فعلى الأغلب لن يحدث شيء يذكر ..
لا اعرف ماوجه اتعراضك على استخدام new اذن :unsure:
تم تعديل هذه المشاركة بواسطة bashmohandes في 19 مايو 2005 في 03:15
Sr. Software Development Engineer
Hulu, LLC
My Blogs
اقتباسانا لا اعرف فيم المناقشة هذه مبادئ و عدم معرفتك بها لا يلغيها
انت تقول انه في حال استخدام new لا يتم حجز الذاكرة الا اذا استخدمتها ..
يعني new char[8] لا يحجز اي شيء حتى يقوم المستخدم باستخدام هذه المساحة!!!
لا يوجد هكذا مبدأ اطلاقا ..
هذا السطر:
char text[8];
و هذا السطر
char * text = new text[8];
يقومان بحجز نفس المساحة من الذاكرة بالظبط.
لا يوجد اي توفير في الذاكرة بين الطريقتين ..
اما تعريف الـ dynamic allocation قأنا اعرفه و هو ليس موضوعنا ..
char *text = new[8 تقوم بالحجز في Run time يعني ليس من المؤكد أنها ستحجز
يعني عندما يصل البرنامج إلى تعليمة new سيحجز الذاكرة في heap و من الممكن ان لا تتوفر فتقوم new بإلقاء exception.
اما char *text[8] فأعتقد انها محددة بمكان ال definition يعني إذا كان Global سيتم الحجز قبل بداية البرنامج في Static storage area اما إذا كان local { } فسيتم الحجز في Stack عند الدخول إلى bloc و سيتم التحرير عند الخروج منه إلا إذا كان Static.
---------------
char* text = new char(n); تقوم بحجز char و عمل initialization بقيمة N
من اجل حجز جدول يجب استخدام [ ] .
new افضل من malloc لانها تعرف النوع و تستدعي constructor.
السلام عليكم
اخواني الاعزاء hasan_aljudy & bashmohandes
شكراً لكم وصلت معلومات ادخل النص باستخدام cin.getline ولكن لو فرضنا انني اريد اخل 3 اسطر هل اضع حجم array كبير نوعاً ما ( مثال 500)
ثانياً اريد ان اقوم بحساب عدد الكلمات وعدد احرفها مثال
4 كلمات تتكون من 5 احرف
3 كلمات تتكون من 2حرف
وقمت باستخدام switch ووضع case1 وحتى case12 ولكن المشكلة لو وجدة كلمة اكثر من 12 حرف فما هو بديل switch علماً انني مبتدأ لم انتهي من كتاب البرمجة كاملاً وانما انتهية من اول خمس فصول ( حتى poenter )
اقتباسثانياً اريد ان اقوم بحساب عدد الكلمات وعدد احرفها مثال4 كلمات تتكون من 5 احرف
3 كلمات تتكون من 2حرف
اعتقد هنا لازم تكتب function خاص من عندك للقيام بهذه العملية.
اول شي لازم تسأل نفسك كيف تحسب عدد الكلمات؟ اعتقد الجواب سيكون ان المسافة هي اللتي تفصل بين الكلمات, للك ممكن الواحد يقول انك تعد المسافات في الجملة ..
ولكن, ماذا لو قام المستخدم بادخال مسافتين او اكثر بعد نفس الكلمة؟ مثلا
hello world
فهنا نغير الطريقة,و و نقول مثلا انك تبدأ بمتابعة حروف الجملة حرفا حرفا .. اذا وجدت مسافة, فسنقول ان الكلمة السابقة انتهت, و سنبدأ البحث عن الكلمة التالية. كيف نبحث عنها؟ نستمر في المرور حتى نجد حرفا ليس بمسافة, فنقول انه بداية كلمة جديدة.
فلكي تعد الكلمات, ستحتاج loop تمر على الجملة حرفا حرفا و تحللها بهذه الطريقة, و يكون عندك عدداد للكلمات (متغير تضع فيه عدد الكلمات اللتي وجدتها) و كلما جدت كلمة جديدة تزيد هذا العداد.
هذي الفكرة العامة,
اذا احتجت شرحا اكثر اخبرني.
السلام عليكم
احس اني اكثرت عليكم الاسئلة ولكن تحملونا شوي
قمت بكتابة البرنامج واستخدمة cin.getline ثلاث مرات ولكن هنالك مشكلة وهي في نهاية السطر عندما اقوم بدمجه array & array2 & array3 في array تظهر مشكلة وهي ان اخر السطر الاول يرتبط مع بداية السطر الثاني والمشكلة الثانية انني وضعت switch حتى اصنف اطول الكلمات ... ولكن كم اضع من case لا اعلم كم طول اطول كلمة في الانجليزي قد يقوم المستخدم بادخال كلمة غير صحيح وتتكون 1000 حرف ولن تظهر له النتيجة .... فما حل بدل السوتش
لم افهم ما قمت به ..
كيف قمت بدمج الـ arrays؟
و كيف استخدمت switch لتصنيف اطول الكلمات؟
هذا الموضوع مغلق.