الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ممكن ان اجد شرح لي cin.getline

مغلق
بدأه gareb في 18 مايو 2005 · 25 رد · 9,025 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاتة

لدي مشكلة في فهم امر cin.getline فهل اجد شرحاً لها

علماً انني اريد الاستفادة منها لادخل نص وليكون من خمس اسطر ..

فما الطريقة

#2

cin.getline يستخدم لقراء سطر كامل من الdos

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#3

السلام عليكم

اخي العزيز شكراً على ردك السريع ولكن هل توضح لي اكثر لني لكي شرح ولكني لم افهمه

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' );

#4

المعنى انه يقرأ السطر كله حتى يصادف الdelimiter الذي حددته و ان لم تحدد له Delimiter فانه يتوقف عن ال n\ او نهاية السطر و بداية سطر جديد

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#5
cin.getline( array, size, delimiter );

على فرض ان array هو من نوع char[] فالدالة تقرأ سطرا من الدوس (سطرا يدخله المستخدم) و يخزنه في array

و الباقي كما قال البشمهندس

#6

اذا قلنا ان انه يخزن في array اذا اردت تخزين سطر كم اضح حجم array

size ماذا تحني عدد الاحرف ...

#7

اظن ان حجم الـ array او عدد الحروف اللتي سيدخلها المستخدم غير معلوم, لذلك عليك ان تحدد حجما للـ array بحيث يكون اكثر مما تتوقع, مثلا 256 ممكن يكون كافي, و لكن قد تصبح هناك مشكلة اذا قام المستخدم بادخال عدد من الحروف اكبر من ذلك, لان البرنامج سيكتب خارج نطاق المصفوفة, مما قد يسبب مشاكل, لذلك نقوم بتمرير حجم المصفوفة الى الدالة لكي تتوقف عندها (حتى لو كان هناك مزيد من المدخلات)

فالـ size يجب ان يكون هو حجم الـ array.

#8

اعتقد انه يمكنك استخدام *char للهروب من مازق الحجم

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#9

السلام عليكم

اشكر الاخوه على هذا التفاعل مع الموضوع وسرعة الرد ولكن هل يمكن توضيح *char لني لابد من احدد حجم array

موضوع ارجوا ان اجد له حلاً

توضيح سوال

تم تعديل هذه المشاركة بواسطة gareb في 18 مايو 2005 في 22:43

#10

لا تستطيع استخدام char * (الا اذا كانت تشير الى مصفوفة).

حدد مصفوفة بحجم معين, ثم اقرأ على الشاشة منها.

#include <iostream>
using namespace std;

int main()
{
	char line[300];
	cin.getline( line, 300 );

	cout << "You entered: " << line << endl;

	return 0;
}
#11

اذا كنت ممن يحبون توفير ال 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

#12
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

#13

استخدام الاقواس المربعة او العادية في هذا الاستخدام بالذات لا تختلف و يمكنك ان تجربها اذا لم تصدقني

في حالة استخدام 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

#14

جرب

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

#15

انا لا اعرف فيم المناقشة هذه مبادئ و عدم معرفتك بها لا يلغيها

استخدام 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

#16
اقتباس
انا لا اعرف فيم المناقشة هذه مبادئ و عدم معرفتك بها لا يلغيها

انت تقول انه في حال استخدام new لا يتم حجز الذاكرة الا اذا استخدمتها ..

يعني new char[8] لا يحجز اي شيء حتى يقوم المستخدم باستخدام هذه المساحة!!!

لا يوجد هكذا مبدأ اطلاقا ..

هذا السطر:

char text[8];

و هذا السطر

char * text = new text[8];

يقومان بحجز نفس المساحة من الذاكرة بالظبط.

لا يوجد اي توفير في الذاكرة بين الطريقتين ..

اما تعريف الـ dynamic allocation قأنا اعرفه و هو ليس موضوعنا ..

#17

اللهم الهمني الصبر

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#18

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.

#19

الحمد لله انك عرفت الفرق لوحدك

الفرق انه عندما اكتب char* text فقط فانه لن يحجز المكان و لكن عندما ااتي في اي مكان في البرنامج و اكتب text = new char[5]; مثلا فسيحجز 5 اماكن من نوع char في الRam

انا اسف لسوء التفاهم

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#20

السلام عليكم

اخواني الاعزاء hasan_aljudy & bashmohandes

شكراً لكم وصلت معلومات ادخل النص باستخدام cin.getline ولكن لو فرضنا انني اريد اخل 3 اسطر هل اضع حجم array كبير نوعاً ما ( مثال 500)

ثانياً اريد ان اقوم بحساب عدد الكلمات وعدد احرفها مثال

4 كلمات تتكون من 5 احرف

3 كلمات تتكون من 2حرف

وقمت باستخدام switch ووضع case1 وحتى case12 ولكن المشكلة لو وجدة كلمة اكثر من 12 حرف فما هو بديل switch علماً انني مبتدأ لم انتهي من كتاب البرمجة كاملاً وانما انتهية من اول خمس فصول ( حتى poenter )

#21

اذا كانت الاسطر الثلاثة ستكتب متتابعة دون newline في اخر كل سطر فيمكنك قراءتها في جملة getline واحدة اما اذا كانت ستدخل ثلاث سطور منفصلة كل منهم ينتهي بnewline اذن عليك استخدام ثلاث getline متتابعين او استخدام loop مثلا

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#22
اقتباس
ثانياً اريد ان اقوم بحساب عدد الكلمات وعدد احرفها مثال

4 كلمات تتكون من 5 احرف

3 كلمات تتكون من 2حرف

اعتقد هنا لازم تكتب function خاص من عندك للقيام بهذه العملية.

اول شي لازم تسأل نفسك كيف تحسب عدد الكلمات؟ اعتقد الجواب سيكون ان المسافة هي اللتي تفصل بين الكلمات, للك ممكن الواحد يقول انك تعد المسافات في الجملة ..

ولكن, ماذا لو قام المستخدم بادخال مسافتين او اكثر بعد نفس الكلمة؟ مثلا

hello    world

فهنا نغير الطريقة,و و نقول مثلا انك تبدأ بمتابعة حروف الجملة حرفا حرفا .. اذا وجدت مسافة, فسنقول ان الكلمة السابقة انتهت, و سنبدأ البحث عن الكلمة التالية. كيف نبحث عنها؟ نستمر في المرور حتى نجد حرفا ليس بمسافة, فنقول انه بداية كلمة جديدة.

فلكي تعد الكلمات, ستحتاج loop تمر على الجملة حرفا حرفا و تحللها بهذه الطريقة, و يكون عندك عدداد للكلمات (متغير تضع فيه عدد الكلمات اللتي وجدتها) و كلما جدت كلمة جديدة تزيد هذا العداد.

هذي الفكرة العامة,

اذا احتجت شرحا اكثر اخبرني.

#23

السلام عليكم

احس اني اكثرت عليكم الاسئلة ولكن تحملونا شوي

قمت بكتابة البرنامج واستخدمة cin.getline ثلاث مرات ولكن هنالك مشكلة وهي في نهاية السطر عندما اقوم بدمجه array & array2 & array3 في array تظهر مشكلة وهي ان اخر السطر الاول يرتبط مع بداية السطر الثاني والمشكلة الثانية انني وضعت switch حتى اصنف اطول الكلمات ... ولكن كم اضع من case لا اعلم كم طول اطول كلمة في الانجليزي قد يقوم المستخدم بادخال كلمة غير صحيح وتتكون 1000 حرف ولن تظهر له النتيجة .... فما حل بدل السوتش

#24

لم افهم ما قمت به ..

كيف قمت بدمج الـ arrays؟

و كيف استخدمت switch لتصنيف اطول الكلمات؟

#25

لمعرفة طول الstring لستخدم الstrlen فستقوم بحساب طول الstring

لماذا دمجت الarrays اعتقد ان المسألة لا تحتاج لهذا

Sr. Software Development Engineer
Hulu, LLC
My Blogs

هذا الموضوع مغلق.

مواضيع مشابهة