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

سؤالين عن C++ ،، كيف اكتب كم كلمة كبيرة في متغير + كيف انفذ امر واجمع بين فاريبل و متغير

رائج
بدأه CPP-Programmer في 18 سبتمبر 2008 · 65 رد · 6,626 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#26

اخى عمرو و X

ما هى خطورة استعمال دالة strcat فانا اول مرة اسمع بخطورتها :S

+ ما قلت اخى عمرو فى تعيين المؤشرات و النصوص , ممكن تشرح هذا الموضوع لأنى مش فاهمه :S

هل هذا معناه انه يفضل استخدام string و ليس char ؟؟

وفقكم الله

#27

خطورة strcat هي أنها لا تعير اهتمامًا لحجم المصفوفة الحرفية التي تكتب فوقها ، مما يجعل من السهل الكتابة فوق طاقة المصفوفة أي الكتابة فوق البيانات الأخرى المجاورة وبالتالي إنشاء أخطاء برمجية من الصعب جدًا إيجادها.

اقرأ في ويكيبيديا عن :

Buffer_overflow

من الأفضل بالطبع أن تستخدم مكتبات النصوص في سي++ ، أي string و wstring ومكتبات سي++ بالإضافة لكونها أأمن فهي أيضًا أسهل ، لكن إن كنتَ مصممًا على استخدام مكتبات سي فيمكنك استخدام الدالة strcat_s فهي النسخة الأحدث والآمن من strcat .

-------

تعرف أن المصفوفة في سي/سي++ هي أيضًا مؤشر إلى العنصر الأول في المصفوفة ، بمعنى أن char[] هو أيضًا char* ، وفي حساب المؤشرات جملة مثل هذه :

pointer1 = pointer2;

تعني أنك تقوم بتعيين المؤشر pointer1 ليشير إلى ما يشير إليه pointer2 ، وليس نسخ المحتويات المؤشر إليها من المؤشر الأول إلى المحتويات المؤشر إليها من المؤشر الثاني.

ولنسخ المحتويات (نسخ النص في هذه الحالة) يجب عليك استخدام الدالة sprintf_s (أو sprintf إذا كنت تريد النسخة الغير آمنة) وليس التعيين المباشر ، التعيين المباشر ممكن فقط في سي++ ، مثل هذا المثال :

string1 = string2 + string3;

وتذكر أن غوغل هو صديقك :

http://www.google.com/search?q=strcat_s

http://www.google.com/search?q=sprintf_s

تم تعديل هذه المشاركة بواسطة عمـــرو في 19 سبتمبر 2008 في 14:08

#28

وبالمناسبة ، لا أدري ما هو أمر get و post في كونسول الويندوز ، لم أسمع بهما من قبل ، ربما القصد على أوامر ال http ؟

في تلك الحالة أفضل مكتبة شبكات أعرفها هي libcurl فهي سهلة ومفتوحة المصدر وعابرة للأنظمة.

http://curl.haxx.se/libcurl/

#29
عمـــرو كتب:
وبالمناسبة ، لا أدري ما هو أمر get و post في كونسول الويندوز ، لم أسمع بهما من قبل ، ربما القصد على أوامر ال http ؟

في تلك الحالة أفضل مكتبة شبكات أعرفها هي libcurl فهي سهلة ومفتوحة المصدر وعابرة للأنظمة.

http://curl.haxx.se/libcurl/

نعم كنت اتكلم عن اوامر HTTP لكن ليس الهدف هو استخدام المكتبة الخاص بها, ما كان في ذهني هو انه ان كان هناك شئ اسمه "get" عبر الكونسول فلا بد هو يتبع نفس المعايير التي تتبعها post و get داخل هذا النظام.

المشكلة انه لا يوجد شئ واضح من هذا, على فكرة الى الآن لا اعرف ما هو التطبيق الذي يقوم البرنامج بطلبه لتنفيذ System("get") .. ممكن اضعه تحت منقح حتى افهم هذه النقطة.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#31

السلام عليكم

time1 جزاك الله خيراً كثيراً والحمدلله اشتغل كودك وتقريبا فهمته 99.9%

لكن عند التشغيل وكتابه الموقع وبعد احضار السورس كود يطلع رسالة Buffer وهذه نصها k.exe has encountered a problem and needs to close. We are sorry for the inconvenience.

:S هل يوجد حل ؟

لكن فعلا فهمت كودك وهو بسيط جداً وحلو وسهل جداً وهذا اهم شئ عشان نفسي تتفتح على اللغة واحبها للانى لسه مبتدئ :D

باقي الاخوة مش عارف فتحو الموضوع نقاش او ايش ؟ للأسف ما فهمت اى شئ

اخوي عمـــرو انا اقصد get ويندوز اللى يحضر السورس كود !!!!!!!!!!

ياشباب مافيه كود لتخطي عملية البفر هذه؟؟

Just C++ Life :)

#32

او ياجماعة انا جربت اكتب

char website[];

بدال

char website[200];

يعني اخليها مفتوحة عشان مايحصلش البوفر لكن طلعلي رسالة خطأ ؟؟

هل فيه طريقة انى اخلي الwebsite يكون مفتوح مثل cmd

وعندي سؤال

ليش لما كتبنا

char cmd[]="get ";

نفع وماطلع خطأ ولما كتبنا

char website[];

وبعدها بالبرنامج عملنا cin علي الويب سيت

طلعلي خطأ ؟ هل لازم احدد عدد لما يكون Input من الخارج ؟

Just C++ Life :)

#33

اخى cpp-programmer مشكلة الـ buffer هى تخطى حجم المصفوفة

المشكلة انه ينشئ مصفوفة بحجم طول اسم الموقع فنحن لم نحسب الكلمة get لذلك اضفت 4 على طول اسم الموقع

هذا الكود الجديد

  1.  
  2. #include<string>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7. char cmd[] = "get ";
  8. string website;
  9. cout << "Enter Website Name : ";
  10. getline(cin, website);
  11. int len = website.length();
  12. const char* site = new char[len+4];
  13. site = website.c_str();
  14. cout << endl << "Website Setted : " << site << endl;
  15. cout << "Please Wait While Source Get .. " << endl ;
  16. strcat(cmd,site);
  17. cout << cmd << endl << "---------------------------" << endl;
  18. system(cmd);
  19. cout << endl;
  20. system("pause");
  21. }
  22.  
  23.  

-------------------------------

تعديل ::

اخى ما تتحدث عنه عند عدم تحديد حجم المصفوفة لا ينف اثناء run time الا باستخدام المؤشرات و الكلمة new

تم تعديل هذه المشاركة بواسطة Omar Eladel في 19 سبتمبر 2008 في 18:28

#34

اخي عمر العادل تقدر لا تستعمل المؤشرات لانى لا افقه فيها اي شئ :S ? او لازم ؟

Just C++ Life :)

#35

جرب اخي ان تضيف في النهاية

	exit(1);
llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#36

جربت الكود اللى اعطيته لى مع انى لم افهمه للأسف بسبب المؤشرات وظهر لى 7 اخطاء

هذا هو كودك اللى وضعته في الكومبيلر

#include<iostream.h>
#include<stdlib.h>
#include<string>
using namespace std;

int main()
{
	char cmd[] = "get ";
	string website;
	cout << "Enter Website Name : ";
	getline(cin, website);
	int len = website.length();
	const char* site = new char[len 4];
	site = website.c_str();
	cout << endl << "Website Setted : " << site << endl;
	cout << "Please Wait While Source Get .. " << endl;
	strcat(cmd,site);
	cout << cmd << endl << "---------------------------" << endl;
	system(cmd);
	cout << endl;
	system("pause");
}

Just C++ Life :)

#37

الحل بدون المؤشرات هو استخدام مصفوفة كبيرة لكن كما ذكر الاخ Xacker ممكن يكون الموقع post & get مثلما ذكروا و عنها لن تستطيع

التحكم فى طول الموقع و ممكن يتخطى المصفوفة فيظهر overflow

#38

جرب اخي الكود مع اضافة exit

char cmd[] = "get ";
	char website[200];
	cout << "Enter Website Name : ";
	cin>>website;
	cout << endl << "Website Setted : " <<website << endl;
	cout << "Please Wait While Source Get .. " << endl;
	strcat(cmd,website);
	cout << "--------------------------------"  << endl;
	system(cmd);
	exit(1);
llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#39

جرب هذا الكود للادخال بدون حجم محدد

char cmd[] = "get ";
	string s;
	cout << "Enter Website Name : ";
	cin>>s;
	cout << endl << "Website Setted : " <<s << endl;
	cout << "Please Wait While Source Get .. " << endl;
	strcat(cmd,s.data());
	cout << "--------------------------------"  << endl;
	system(cmd);
llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#40

اخي time1 تم حل المشكلة كاملاً بحمدالله

ونشكر الله تعالى ثم نشكرك يا time1

وتم حلها بـ

exit(1)

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

تم حل المشكلتين بحمدالله

وأي شئ يقف امامى ان شاء الله حسألكم وشايفكم ماشاء الله ماتقصرون يعطيكم العافية فهد و time1 و عمرو العادل و وكل الباقي

جزاكم الله خيراً .. وان شاء الله الان حروح احمل كم كتاب واقرأ واتعلم فيهم وبعدهم بشوف المؤشرات

Just C++ Life :)

#41

اخي time1 ممكن تعطيني الكود الكامل + المكتباب يعني الكود الكامل يعني نسخ ولصق للبرنامج علطول بتاع

char cmd[] = "get ";
	string s;
	cout << "Enter Website Name : ";
	cin>>s;
	cout << endl << "Website Setted : " <<s << endl;
	cout << "Please Wait While Source Get .. " << endl;
	strcat(cmd,s.data());
	cout << "--------------------------------"  << endl;
	system(cmd);

لانه الحكاية دي حتفيدني اوى لو عرفت اخلي string مفتوح بدون حجم !!

لانى نسخت الكود ولصقته

وحطيت 3 مكتبات اساسية

string.h , stdlib.h , isotream.h

ياريت تعطيني الكود كامل

وشكراً

Just C++ Life :)

#42
#include<iostream>
using namespace std;
#include<string>
#include<stdlib.h>
main()
{
	char cmd[] = "get ";
	string s;
	cout << "Enter Website Name : ";
	cin>>s;
	strcat(cmd,s.data());
	system(cmd);
	return 0;
}
llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#43

حبيبي تايم1 جميل جداً وهذه احلي من الـcharواحلى من انك تحدد عدد الحروف وهذه كمان ما راح تسوي بفر ;)

الثانية كانت عبارة عن تحايل اللى كانت exit(1) والتحايل هو انه بيتحايل او بمعني اصح يخرج من قبل مايخرج من البرنامج.

فعلاً time1 ماشاءالله فادتني كتيررر بحكاية السترنج وبعدها تطلعها .data ;) جزاك الله خيرا ....

:blink:

Just C++ Life :)

#44

لماذا لا تستعملون سي++ ؟ أنظف وأجمل وبدون buffer overflow ولا دوال خاصة لنسخ النصوص ، هذه هي الشفرة ( ولكنها لن تعمل كما تريد لأنه لا يوجد برنامج في الويندوز اسمه get ) :

#include<iostream>
#include<string>

using namespace std;
void main()
{
	string cmd("get ");
	string s;
	cout << "Enter Website Name : ";
	getline(cin, s);
	cmd += s;
	system(cmd.c_str());
}

تم تعديل هذه المشاركة بواسطة عمـــرو في 20 سبتمبر 2008 في 02:40

#45

اخى عمرو , فى فترة تعلمى للسى++ كنت احاول اهمال الجزء الخاص بـ C-Strings اللى بيدرس char arrays فل افهمه الا بصعوبة

و كنت افضل اتعامل مع string فهو اسهل و لا تحتاج لـ \0 null و ما الى ذلك من اشياء قديمة

فعلا مكتبات السى++ احسن بكثيـــــــــر + امنة

#46

مكتبات السي++ بالتأكيد أفضل أخي عمر ، لكن هذا لا يمنع أن تتعلم مكتبات السي أيضًا ، لأنك وإن كنت ستكتب سي++ فقط ، لكن لابد سيظهر موقف يتحتم عليك فيه قراءة شفرات السي التي كتبها الآخرون.

#47
Xacker كتب:
من المعروف أن دالة strcat خطيرة ويحذر منها، ولا أعتقد أن هذا يخفى على الأخوة - شكراً على التذكير بأي حال بارك الله بك.
ما هذا الكلام العجيب ! :wacko:

المعروف لدى أن دارس للسى استخدام strcat يتم فى حالة اليقين أنه لن يحدث Overflow

بمعنى أن لديك Buffer بطول 100 بايت، وستلصق به 2 من الـ Buffers بطول كل منهم 40 بايت مثلاً على الاقصى

أما اذا كنت غير واثق من طول ال Buffers فلغة السى توفر لك الدالة البديلة strncat حتى لا يحدث Overflow

واتمنى لا تقول لى ان strncat ايضاً خطيره :wink: ... لانها مثل memcpy التى تستخدمها العديد من الدوال الاخرى، والا لغة السى كلها خطيرة :S

عدم المامك بدول السى وحسن استخدام الداله المناسبه للغرض المناسب، لا يعنى ان الداله خطيرة

فعند استخدامك للدالة strncpy لنسخ محتوى buffer ثنائى وليس نصى إلى أخر وتحصل على نتائج خطأ، فهذا مرده انك استخدمة الدالة الخطأ وليس قصوراً فى لغة السى أو خطورة فى دوالها، لأن الدالة الصحيحه ستكون memcpy وليس strncpy

#48
سمسوما كتب:
والا لغة السى كلها خطيرة :S

بالضبط!

الدالة strcat تستخدم لإلحاق نص بنص ، وهي مختلفة عن strncpy التي تستخدم لنسخ النصوص ، هذا غير أن strncpy تأخذ عدد الذرات bytes الذي ستنسخه من النص المصدر إلى الوجهة بغض النظر عن حجم النص الوجهة ، مما يجعلها هي أيضًا خطيرة.

وإذا لم تكن مقتنع أن strcat دالة خطيرة ، ربما تريد أن تسأل مصمموا لغة السي لماذا strcat الآن منبوذة - deprecated - ولماذا هناك strcat_s بدلاً منها ؟

والملحق _s بالمناسبة هو اختصار ل safe.

http://msdn.microsoft.com/en-us/library/kk6xf663(VS.80).aspx

http://bytes.com/forum/thread285299.html

#49
عمـــرو كتب:
بالضبط!

الدالة strcat تستخدم لإلحاق نص بنص ، وهي مختلفة عن strncpy التي تستخدم لنسخ النصوص ، هذا غير أن strncpy تأخذ عدد الذرات bytes الذي ستنسخه من النص المصدر إلى الوجهة بغض النظر عن حجم النص الوجهة ، مما يجعلها هي أيضًا خطيرة.

وإذا لم تكن مقتنع أن strcat دالة خطيرة ، ربما تريد أن تسأل مصمموا لغة السي لماذا strcat الآن منبوذة - deprecated - ولماذا هناك strcat_s بدلاً منها ؟

والملحق _s بالمناسبة هو اختصار ل safe.

http://msdn.microsoft.com/en-us/library/kk6xf663(VS.80).aspx

http://bytes.com/forum/thread285299.html

اقتباس
هذا غير أن strncpy تأخذ عدد الذرات bytes الذي ستنسخه من النص المصدر إلى الوجهة بغض النظر عن حجم النص الوجهة
انت مش فاهم سى، وما ذكرته خطأ... strncpy تنسخ بحد أقصى الحجم المحدد (وهو حجم الواجهة بغض النظر عن حجم النص المصدر) أو حتى تجد 0\ ، فمبرمج السى اليقظ المتمرس يحدد حجم الواجهة وليس المصدر !

لن أدخل معك فى جدال حول توظيف اى داله بطريقة خطأ فى اى لغه قد يكون نتائجه سلبيه، لأن هذه نقطه محسومه لدى اى مبرمج!

ولكن سأثبت لك بمثال بسيط جداً: حتى لو استخدمت strcat_s وحددت حجم واجهة أكبر من الحجم الحقيقى ... سيحدث خطأ، فهذا يرجع لمدى احتراف المبرمج ومدى قدرته على استخدام وتوظيف ادوات اللغة، والحل العملى للخروج من هذه المشكله استخدام ++C مثل string او فى MFC مثل CString او فى COM مثل _bstr_t أو _variant_t

ولكن أسئلك سؤال واحد فقط: هل الدالة strcat_s قياسية؟ (هل موجوده فى ANSI C ولجميع المترجمات الاخرى غير MSVS؟)

تم تعديل هذه المشاركة بواسطة سمسوما في 20 سبتمبر 2008 في 22:54

#50
سمسوما كتب:
عدم المامك بدول السى وحسن استخدام الداله المناسبه للغرض المناسب، لا يعنى ان الداله خطيرة

أنا لم أقل أني ملم بدوال سي، لكن هذا لا يعني ان الدالة توفر بيئة آمنة لاستخدامها من قبل مبرمج سي.

نقطة نظام: كون المبرمج ماهر ومحترف لا يعني ان الدالة تصبح ممتازة ولا يغني عنها شئ وإلا لما كان ظهر هناك تحسينات في دوال كثيرة وذكر تنبيه يفيد بضرورة استخدام هذه الدالة بدلاً من أخرى. عندما تكون مبرمج محترف وتريد استخدام strcat فهذا شئ، وعندما تريد إيصال معلومة لشخص ما فعليك إيصالها بصدق وبأمانة حتى لا تدخل في إثم إيصال معلومة خاطئة قد يعتمد عليها في بناء برامجه، وأعتقد أن صاحب هذا الموضوع الآن أصبح لديه خلفية جيدة عن دالة strcat والدالة المحسنة منها strcat_s وهذا هو الهدف.

ليس أن نعلمه إبراز عضلاته نقول له استخدم ما تشاء فأنت في أمان ومن الواجب عليك ان تكون هذه النقطة محسومة لك لأنك مبرمج، عيب، أن تكون جديد على اللغة ليس عذراً لك!

أتمنى أن تكون الفكرة قد وصلتك.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…