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

خطأ في استخدام strcmp ؟

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

السلام عليكم

عندي مشكلة في أستخدام الدالة strcmp حاولت أكثر من مره لكن كله أخطاء وهذا البرنامج بطريقتين مختلفتين مره باستخدام if ومره باستخدام switch

البرنامج يقوم بسؤال المستخدم ويختار المستخدم أما first أو second و third

#include<stdio.h>
#include<string.h>


void main()
{
	 char x[10];

	 printf("what is the capital of kuwait:\n");
	 printf("first) Doha\n");
	 print("second) kuwait\n");
	 printf("third) cairo\n");
	 printf("choice the correct answer:");
	 scanf("%s",x);

	 switch(x){
	 case(strcmp(x,"first")):
	 case(strcmp(x,"third")):
	 printf("\n wrong answer\n");
	 break;
	 case(strcmp(x,"second")):
	 printf("\ncorrect answer\n");
	 break;
	 default:
	 printf("\nwrong choice\n");
	 }

	 getch();

}

#include<stdio.h>
#include<string.h>


void main()
{
	 char x[10];

	 printf("what is the capital of kuwait:\n");
	 printf("first) Doha\n");
	 print("second) kuwait\n");
	 printf("third) cairo\n");
	 printf("choice the correct answer:");
	 scanf("%s",x);

	 if(strcmp(x,"first")||srtcmp(x,"third"))
	 {
	   printf("\nwrong answer\n");
	 }
	 else if(strcmp(x,"second"))
	 {
	   printf("\ncorrect answer\n");
	 }
	 else{
	   printf("\nwrong choice\n");
		 }


	 getch();

}

وعندي سؤال ثاني معنى الدالة return ؟ واستخداماتها وفوائدها ؟ بالإضافة لمثال يوضحها ؟

( لأني شفت أكثر من كتاب لكن ما فهمت المقصود من هذي الداله بالضبط )

وشكرا مقدما

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

#2

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

هل قرأت ما تفعله دالة ال strcmp قبل استخدامها ..

عموما .. هناك بعض الأخطاء في البرنامج

print("second) kuwait\n"); //

لازم تكون printf و ليس print

if(!strcmp(x,"first")|| !srtcmp(x,"third"))

strcmp و ليس srtcmp

strcmp ترجع صفرا اذا كان الشيئين متساويين و قيمه غير صفريه ان كانوا مختلفين ..

#3

شكرا أخوي يوسف

أنا عدلت الأخطاء ولكن مازل هناك خطاء باستخدام switch اما باستخدام if أشتغل لكن إذا أخترت first أو second و third أو أي شيء ثاني يطبع عبارة وحدة وهي wrong answer شنو المشكلة بالضبط ؟؟؟؟؟!!!!!!

بالنسبة لاستخدام الدالة strcmp أقدر من خلالها أن أختار كلمة كاملة وليس حرف أو رقم لكي يقارن الإجابة باللي كتبتة مثلا إذا كتبت second يجيك بالداله if وطبع عبارة correct answer يعني تأخذ كلمة كاملة وليس مجرد حرف هذا أللي أعرفة وإذا ما عليك أمر ممكن توضح العبارة أللي قلتها أكثر :

" strcmp ترجع صفرا اذا كان الشيئين متساويين و قيمه غير صفريه ان كانوا مختلفين .. "

وجزاك الله خير

#4

لو قرأت شو تسوي strcmp ستعرف لماذا..

int strcmp(const char *s1, const char *s2);

The function strcmp() returns a positive integer if string s1 is lexically greater than string s2; zero if the two strings are identical; and a negative integer if string s1 is lexically less than string s2

يعني مثلا لو قلنا:

s1="a"

s2="a"

if(strcmp(s1,s2).

ماذا سيكون الناتج؟

و لو غيرنا s1 ماذا سيكون الناتج ..

أما بالنسبة ل switch

على حد علمي أنها تأخذ رقم أو حرف فقط .. لا أعرف ان كانت تسمح باستخدام string

هذا و الله أعلم ..

تم تعديل هذه المشاركة بواسطة Yousof في 20 مايو 2006 في 23:33

#5

انا انصحك باستخدام الكود التالي

 num= strcmp(x,"kuwait");

switch(num)

{

case 0: printf(" you are right !\n");
break;
defualt :

printf("Sorry... wrong answear \n");

}




strcmp 
ترجع صفر لو الاثنين متساوين وغير ذالك اذا لم يتساوو 

 انا بنصحك انك ماتعبش نفسك استخدم الارقام وليس string

enter 1 for doha 
enter 2 for kuwait
and soon

JiFvydhdnG.gif

There are two ways to live: you can live as if nothing is a miracle;

you can live as if everything is a miracle

#6

توجد ثغره في الكود وهي انك تستطيع تمرير اي حجم من البيانات ل x بدون التأكيد على حجمه

فسوف يحدث overflow .... لذلك يجب عليك كتابه كود للتأكيد على الحجم

مثال :

		if(strlen(x) > MAX_SIZE) {
				fprintf(stderr,"[+] Buffer overflow detected .\n");
				fprintf(stderr,"[+] Exiting ....\n");
				exit(1);
		}

دليل :

في الكود القديم

Qnix ~ > ulimit -c unlimited
Qnix ~ > make c2
cc	 c2.c   -o c2
Qnix ~ > ./c2
What is the capital of kuwait :
first) Doha
second) kuwait
third) cairo

Chose the Correct answer : AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Wrong
Segmentation fault (core dumped)
Qnix ~ > gdb -c core -q
(no debugging symbols found)
Using host libthread_db library "/lib/libthread_db.so.1".
Core was generated by `./c2'.
Program terminated with signal 11, Segmentation fault.
#0  0x41414141 in ?? ()
gdb> i r $eip
eip			0x41414141	   0x41414141

هاذا الخطء سوف يحدث في برنامج فعليك من الاّن ان تحمي الاكواد التي تكتبها ... كي لاتكتب

برامج لاتملك الحمايه الكافيه في المستقبل القريب إن شاء الله :rolleyes:

هاذا مثال للكود المعدل

#include <stdio.h>
#include <string.h>

#define MAX_SIZE		10

int main(void) {
		char x[MAX_SIZE];

		fprintf(stdout,"What is the capital of kuwait : \n");
		fprintf(stdout,"first) Doha\n");
		fprintf(stdout,"second) kuwait\n");
		fprintf(stdout,"third) cairo\n");
		fprintf(stdout,"\nChose the Correct answer : ");
		scanf("%s",x);

		if(strlen(x) > MAX_SIZE) {
				fprintf(stderr,"[+] Buffer overflow detected .\n");
				fprintf(stderr,"[+] Exiting ....\n");
				exit(1);
		}

		if(strcmp(x,"second") == 0) {
				fprintf(stdout,"Correct\n");
				return 0;
		} else {
				fprintf(stderr,"Wrong\n");
				return -1;
		}

		return 0;
}

باتش :

4,5c4
< 
< void main()
---
> int main(void)
11c10
<	  print("second) kuwait\n");
---
>	  printf("second) kuwait\n");
15,16c14,21
<	 
<	  if(strcmp(x,"first")||srtcmp(x,"third"))
---
> 
> 	 if(strlen(x) > 10) {
> 		 printf("[*] buffer overflow detected.\n");
> 		 printf("[*] Exiting ...\n");
> 		 exit(1);
> 	 }
> 
>	  if(strcmp(x,"second") == 0)
18c23
<		printf("\nwrong answer\n");
---
>		printf("\ncorrect answer\n");
20c25
<	  else if(strcmp(x,"second"))
---
>	  else
22c27
<		printf("\ncorrect answer\n");
---
>		printf("\nwrong answer\n");
24,27d28
<	  else{
<		printf("\nwrong choice\n");
<		  }
<	 
32d32
<

تم تعديل هذه المشاركة بواسطة Qnix في 21 مايو 2006 في 12:42

#7

يعطيكم ألف عافية

أخوي Timmy صح التعامل مع الأرقام سهل بس أنا أحد الطريق الصعب :rolleyes:

عدل كلامك أخوي Qnix بس أنا ألحين أهتم بشيء واحد أعرف طريقة البرمجة والحماية تجي بوقتها :) بس والله فكرة حلوة أللي سويتها وراح أستفيد منها بالمستقبل إن شاء الله بس حاليا راح أسوي شغله بسيطه وهي %6s وهي تقوم بأخذ أول سته أحرف فقط وتهمل الباقي مهما كان حجمة هذا في الوقت الحالي فقط :lol:

أنا الحمدلله عرفت معنى strcmp عدل أنطلاقا من كلام الأخ الحبيب Yousof له كل الشكر

هذي المعلومات يمكن يستفيد منها الغير

طبعا أستخدام strcmp راح يعطيك ثلاث قيم وهي كالتالي :

0 (zero) when the 2 strings are exactly the same.
-1 when the first string is before the second (in alphabetical order)
1  when the second string is before the first (in alphabetical order)

وهذا مثال يوضح المعنى :

#include<stdio.h>
#include<string>

main()
{
   char word1[31],word2[31];
   printf("Enter two words: ");
   scanf("%30s %30s",word1,word2);
   while(strcmp(word1,"END") !=0)
   {
	 printf("	  In order they are: ");
	 if(strcmp(word1,word2)<=0)
	 {
	   printf("%s %s\n",word1,word2);
	 }else{
		   printf("%s %s (swapped)\n",word2,word1);
		  }
		  prinft("Enter two words: ");
		  scanf("%30s %30s",word1,word2);
	 }
	 printf("Detected END word\n");

}

في المثال السابق لو أدخلنا الكلمتين word processing راح يكون الناتج In order they are : processing word (swapped)

شلون طلع هذا الناتج ؟

الإجابه هي أن الدالة strcmp لا تأخذ الكلمة بالكامل وتقوم بتحليلها ولكن تقوم بأخذ الحرف الأول من كل كلمة في الكلمة الأولى word أول حرف هو w ووفها لجدول الأسكي كود فهو يحمل الرقم 119 أما في الكلمة الثانية processing أول حرف هو p ويحمل الرقم 112 أي أن processing تسبق word وبالتالي word2 يسبق word1 فظهر الناتج كما هو مبين في السابق وللتأكيد على ذلك قم بتجربة هذه الكلمات وأعرف الناتج وقم بالتحليل لماذا ظهر هذا الناتج :

never never

wild west

endword Found?

end found?

END found?

طبعا من الصعب أستخدام الدالة strcmp مع switch ومن السهل أستخدامها مع if لذلك يفضل استخدام if كان الحل على سؤلي هو التالي :

#include<stdio.h>
#include<string.h>


void main()
{
	 char x[10];

	 printf("what is the capital of kuwait:\n");
	 printf("first ) Doha\n");
	 printf("second ) kuwait\n");
	 printf("third ) cairo\n");
	 Qustion:
	 printf("choice the correct answer:");
	 scanf("%s",x);

	 if(strcmp(x,"first")==0||strcmp(x,"third")==0)
	 {
	   printf("\nwrong answer\n");
	 }
	 else if(strcmp(x,"second")==0)
	 {
	   printf("\ncorrect answer\n");
	 }
	 else{
	   printf("\nwrong choice\n");
		 }

		 goto Qustion;


	 getch();

}

أما بخصوص الدالة return فهي تستخدم إذا كان الـ functions راح يرد نتائج مثلا

int add_num(int x, int y)
{
  return(x+y);
}

في المثال السابق function "add_num" تأخذ مدخلين صحيحين أي 2 integer inputs ثم تقوم بعمل بعض الحسابات ..الخ وتقوم بإخراج ناتج كعددين صحيحين أي returns the result as an integer

هذا أللي فهمتة وأي إضافات أرحب فيها تأكيد وراح يكون لها فائدة مهما كانت كبيره أم صغيره

شكرا للأخوة Yousof و Timmy و Qnix مساعدتهم وجزاكم الله خير

تم تعديل هذه المشاركة بواسطة SB4 في 23 مايو 2006 في 20:56

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

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