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

البرنامج يطوف السطر الأول للداله gets ?!

مغلق
بدأه SB4 في 4 يوليو 2006 · 6 رد · 686 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

شلونكم أخواني إن شاء الله بخير

الصراحة عندي برنامج مصمم أول شيء ندخل عدد الطلب وبعدها ندخل على التكرار for loop وندخل اسم الطالب وبعدها درجة الأمتحان الأول والثاني والثالث والرابع وبعدها ندخل درجة الإمتحان النهائي وثم يجمع العلامات ثم يضغ النسبة بالإضافة للتقدير A , B , C , D & F ولكن المشكلة أن يطوف أول سطر وهو أدخال أسم الطالب باستخدام الداله gets ولكن عند استخدام scanf لا توجد مشاكل فما المشكلة وما هو الحل :

#include<stdio.h>


void main()
{
	 int st_num,counter,fir_assig,sec_assig,thi_assig,fou_assig,exam,final_percentages;
	 char st_name[15];
	 printf("Enter number of student's: ");
	 scanf("%d",&st_num);

	 for(counter=0;counter<st_num;counter++)
	 {
	   printf("first name is: ");
	   gets(st_name);
	   printf("Enter the first assignments result (%%5) : ");
	   scanf("%d",&fir_assig);
	   printf("Enter the sencond assignments result (%%5) : ");
	   scanf("%d",&sec_assig);
	   printf("Enter the therd assignments result (%%10) : ");
	   scanf("%d",&thi_assig);
	   printf("Enter the fourth assignments result (%%10) : ");
	   scanf("%d",&fou_assig);
	   printf("Enter the exam result (%%70) : ");
	   scanf("%d",&exam);
	   final_percentages=fir_assig+sec_assig+thi_assig+fou_assig+exam;
	   printf("Student name is %s, final percentages %%%d, ",st_name,final_percentages);
	   if(final_percentages<50)
	   {
		 printf("grades is F\n");
	   }else if(final_percentages>=50&&final_percentages<65)
	   {
		 printf("grades is C\n");
	   }else if(final_percentages>=65&&final_percentages<80)
	   {
		 printf("grades is B\n");
	   }else if(final_percentages>=80&&final_percentages<=100)
	   {
		 printf("grades is A\n");
	   }

	   }


	 getch();

}

وشكرا مقدما ...

#2

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

قم باستبدال

gets(st_name);

بالدالة التالية

scanf("%s",st_name);

واختفى المشكل :lol:

#3

شكرا أخوي pengo

أعرف هذي الطريقة :)

لكن أللي أبي أعرفة شنو المشكلة في أستخدام gets هنا ؟؟؟!!!!!

وشاكرلك تشريفك للموضوع

#4

السلام عليكم .

انا لا ارى اية خطأ في استخدام الدالة . لكن كنصيحة هده الدالة لا يفضل بتاتا استخدامها لانها ليست امنة .

كمثال هده تجربة بسيطة لاستخدام هده الدالة و عملة debug حتى ترى اخطارها بنفسك

gets2ov.jpg

كما تلاحظ buffer overflow من الدرجة الاولى هدا في برنامج صغير لكن تخيل في برنامج كبير كم ستكون الاضرار .

ادا اردت ان تضيف امانا لبرنامجك فاستخدم دالة الادخال كالتالي :

scanf5xq.jpg

هنا تم عكس ثغرة buffer overflow . B)

تحياتي .

#5

المشكلة هي في هذا السطر:

scanf("%d",&st_num);

والمشكلة بالتحديد في ضغطـة الانتر ، التي ستظل معلقـة تنتظر من يلقطها ، وستجد الدالة gets بانتظارها ، لذلك يتم إدخال المحرف "n\" في المتغير st_name ، ولو جربت طباعـة هذا المتغير ستجد أنه يطبع سطر جديد فقط....

الحل لهذه المشكلة هـو أن تكتب قبل الدالة gets دالة أخرى تستطيع إلتقاط ضغطـة الانتر الأخيرة مثلاً أكتب السطر التالي قبل الجملة for :

getchar();

أو

scanf("%c");

أو أي دالة أخرى....

هذه المشكلة واجهتها قبل مدة طويلـة ،،، وكانت هذه نظريتي حولها :D

#6

إضافة الى ما ذكره الأخ سلطان يمكن إستعمال

fflush(stdin);

راجع ماهو عمل(fflush(stdin وماهو عمل <include<stdlib.h#

طبعاً هذا بعيداً عن الحديث حول Buffer overflow ..

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#7

يعطيك العافية أخوي pengo على التوضيح

والصراحةأستفدت منه :)

شكرا أخوي Sultan_Althibity وإذا تبي الصراحة عند أتوقع أن المشكلمة من الإنتر في البداية وحاولت أحل المشكلة أكثر من مره فقلت لا المشكلة أكبر من الإنتر فاستخدمت الدالة scanf كحل بديل :) ويعطيك العافية على التوضيح الرائع

ما قصرت أخوي cipher

حلو معلومة حلوه تفيدني بعدين إن شاء الله :)

شكرا للأخوه الكرام وبارك الله فيكم

ألحين صرت جاهز للدخول لفصل Writing function with arguments and results :)

تم تعديل هذه المشاركة بواسطة SB4 في 6 يوليو 2006 في 19:00

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

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

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

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

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

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