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

مساعدة بحل مسألة string match

بدأه ريحانة الاقصى في 15 مايو 2012 · 14 رد · 951 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

اريد ان اعمل برنامج

write program that has two string .the programe has function to search about string 2 in the string 1

your programe should return the addres of first match if no match exist return null

#include <iostream.h>
#include<stdio.h>

char[] stringCompare(char[],char[]);
int main(){

	 char str1[100],str2[100];
	 char compare [100];

	 printf("Enter first string: ");
    scanf("%s",str1);

	 printf("Enter second string: ");
	 scanf("%s",str2);

 compare = 	stringCompare(str1,str2);


	 return 0;
}
char[] stringCompare(char str1[],char str2[]){

	  char match[100];
	// while(str1!='\0' && str2!='\0'){
	 for(int i=0;i<100;i++) {
		 for(int j=0;j<100;j++){

			if(str1==str2[j]){
				 match=str1;
				 }
			if(str1!=str2){

				 break;
			}
		}
	 }

	cout<<match;


	 return match;

	}

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

انا مبتدئة جدا في السي هل لكم مساعدتي

#2

لديك أخطاء في برنامجك, أولها :

#include <iostream.h>

هذه المكتبة الإخراج والإدخال الخاصة بـc++ وليست لـc.

لايمكن تمرير مصفوفة نصية لدالة بهذه الطريقة :

char[] stringCompare(char[],char[]);

وﻻ تعيد الدوال مصفوفات نصية كتلك, بل تأخذ مؤشرّ char* وتعيد مؤشّر. إنظري لهذا المثال لكيفية أخذ الدالة سلسلة نصية :

#include<stdio.h>

void my_print(char * string);

int main(void) {
    char *one       = "Hello!";
    my_print(one);
    return(0);
}
void my_print(char * string) {
    printf("%s\n", string);
}

$ ./a.out Hello!
$

#include<stdio.h>

char* return_a_string(void);

int main(void) {
    printf("%s\n", return_a_string());
    return(0);
}

char* return_a_string(void) {
    char* string = "Hello!";
    return string;
}

$ ./a.out Hello!
$

---

إنظري لهذا الحل, أكثر بساطة وأقل خطوات :

#include<stdio.h>

char search_match(char * fstring, char * sstring);

int main(void) {

    char fstring[256];
    char sstring[256];
    char match;

    printf("First string: ");
    scanf("%255s", &fstring);
    printf("Second string: ");
    scanf("%255s", &sstring);

    if( (match = search_match(fstring, sstring)) == '\0' )
        printf("No match.\n");
    else
        printf("First match is at %c.\n", match);

    return(0);    
}

char search_match(char * fstring, char * sstring) {

    int i;
    int j;

    for( i = 0 ; fstring != '\0' ; i++ )
        for( j = 0 ; sstring[j] != '\0' ; j++ )
            if( fstring == sstring[j] )
                return fstring;

    return '\0';
}

$ ./a.out First string: aadddd
Second string: 2dsse
First match at d.
$ ./a.out 
First string: ad
Second string: fx
No match.
$ ./a.out 
First string: a
Second string: dddd
No match.
$ ./a.out 
First string: wwwwe
Second string: e 
First match at e.
$

تم تعديل هذه المشاركة بواسطة Mr.B في 15 مايو 2012 في 19:44

1
#3

انا لا اريد اول حرف فقط وانما اول مقطع

#4

فكرة هذا السؤال البحث عن النص2 داخل النص1 اذا تم ايجاد تطابق نرجع فى اي موضع من النص1 نرجع بداية أول تطابق. أى اننا بحاجة الى دالة تشبه دالة find و find_first

واذا لم نجد اى تطابق نرجع قيمة NULL.

حقيقة انا ﻻ اعرف اﻻدوات المتاحة معك:

هل مسموح استخدام الفئة string وهنا الحل سهل.

هل مسموح باستخدام مكتبة القواب القياسية وهنا الحل أكثر سهولة.

أم المسموح هو تطوير دالة بكود سي++ بدون استخدام الفئة string و مكتبة STL ؟ وهنا يصبح الحل مستهلك للوقت يشيب الرأس

فما هى الحلول تناسبك ..

والله من وراءء القصد.

تم تعديل هذه المشاركة بواسطة AudaNix في 16 مايو 2012 في 17:46

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#5
AudaNix كتب:

فكرة هذا السؤال البحث عن النص2 النص1 اذا تم ايجاد تطابق نرجع فى اي موضع من النص1 نرجع بداية أول تطابق. أى اننا بحاجة الى دالة تشبه دالة find و find_first

واذا لم نجد اى تطابق نرجع قيمة NULL.

حقيقة انا ﻻ اعرف اﻻدوات المتاحة معك:

هل مسموح استخدام الفئة string وهنا الحل سهل.

هل مسموح باستخدام مكتبة القواب القياسية وهنا الحل أكثر سهولة.

أم المسموح هو تطوير دالة بكود سي++ بدون استخدام الفئة string و مكتبة STL ؟ وهنا يصبح الحل مستهلك للوقت يشيب الرأس

فما هى الحلول تناسبك ..

والله من وراءء القصد.

انا ما احاول عمله هو الطريقة التالتة ^_^ المستهلك للوقت والمشيب للرأس

ولكن هل ممكن ان أرى الطرق الاخرى للفائدة

#6

شكرا اخي Mr.B Icon لقد عدلته بناءا على ملاحظاتك ..

#include<stdio.h>

#include <iostream.h>

char* search_match(char * fstring, char * sstring);

int main(void) {

    char fstring[256];
    char sstring[256];
	 char* match;

    printf("First string: ");
    scanf("%255s", &fstring);
    printf("Second string: ");
    scanf("%255s", &sstring);

	 if( (match = search_match(fstring, sstring)) == '\0' )
        printf("No match.\n");
	 else
		  cout<<match;

	 return(0);
}

char* search_match(char * fstring, char * sstring) {

    int i;
    int j;
	 char match[225];

    for( i = 0 ; fstring != '\0' ; i++ )
        for( j = 0 ; sstring[j] != '\0' ; j++ )
            if( fstring == sstring[j] )
					 match= fstring;

				return match;

	 return '\0';
}
#7

انا حاولت أجرب كود أخى Mr.B لكن ﻻ جدوى يعطى نتيجة مبهة أنظر:

مع اننا اعطيناة أثنين سلسلة متطابقة ومع ذلك .... راجع الكود .

#include<stdio.h>
#include <iostream>
using namespace std;

char* search_match(char * fstring, char * sstring);

int main(void)
{

    char *match = NULL;
    char *str1 = "Auda", *str2 = "Auda";;

    match = search_match(str1, str2);  
    if (match != NULL)
        cout << match;
    else
        cout << "Not match";      

    return (0);
}

المخرجات:

RUN SUCCESSFUL (total time: 136ms)

ليس من السهل كتابة كود كما تتطلبة اﻻخوت ريحانة اﻻقصى.

أعتقدُ انه يتطب خوارزمية معقدة قليلة ويتطلب الفكرة من مشرفنا القدير محمد علاء الدين.

والله من وراء القصد ...

تم تعديل هذه المشاركة بواسطة AudaNix في 16 مايو 2012 في 13:23

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#8

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

هذه محاولتي لإيجاد الحل تشتغل معي نسبيا وغير متأكد من هذا الحل هل هو صحيح أم لا؟

جربيه بنفسك ؟

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

void cmpr(const char*,const char* );


int main(void)
{


char chaine1[255]={0},chaine2[255]={0};

    printf("1 er chaine  max(255): ");
    gets(chaine1);
    printf("2 eme chaine max(255): ");
    gets(chaine2);


    cmpr(chaine1,chaine2);

    return 0;
}

void cmpr(const char *a,const char*b )

{


int i=0,j=0,VRAI=0;

for(i=0;*(a+i)!='\0';i++)

{


for(j=0;*(b+j)!='\0';j++)

 {

   if(*(a+i)==*(b+j))

     {

        while (*(a+i)==*(b+j))

           {

              printf("%c",*(a+i)); i++; j++; VRAI=1;

           }

        break;

     }


 }

     if(VRAI==1 || *(b+j)!='\0' )   break;
}



if(VRAI==0) printf("no mutch");


}

المخرجات

133715842251.jpg

و بالتوفيق

تم تعديل هذه المشاركة بواسطة مومو (momo) في 16 مايو 2012 في 21:43

i love you mama

#9
#include<iostream>
using std::cout;
using std::endl;

int search_match(const char *txt,const char *subText);

int main(void) {
	cout << search_match("mohamed","me") << endl;
    return 0;
}

int search_match(const char *txt,const char *subText) {

    int index = -1;
	for(int i = 0 ; txt != '\0' ; ++i)
	{
		if(txt == subText[0]){
		    index = i;
		    for(int j = 0;subText[j] != '\0' ; ++j)
		    {
			    if(txt[i + j] != subText[j]){
			        index = -1;
				    break;
			    }
		    }
		}
	}

    return index;
}

try this :)


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#10
#include <iostream>
using namespace std;

char* find(const char* str, const char* find);

int main()
{
    char* s1 = "C++ is modern computer language that is popular and easy to learn.";
    char* s2 = "learn.";

    char* s3=find(s1, s2);

    cout.write(s3, strlen(s2));
}

char* find(const char* str, const char* find)
{
    unsigned size1 = strlen(str);
    unsigned size2 = strlen(find);

    if (str == NULL || find == NULL || size1 == 0 || size2 == 0 || size2 > size1) return NULL;

    if (size2 == 1)
    {
        while(str) if (*find == *str++) return (char*)str-1;

        return NULL;
    }

    const unsigned loop_size = size1 - size2 + 1;
    const unsigned last_index = size2 - 1;
    char *find2 = (char*)find;

    for (unsigned i=0; i<loop_size; ++i)
    {
        find2 = (char*)find;
        size1 = size2;
        if (*str != *find2 || str[last_index] != find2[last_index])
        {
            ++str;
            continue;
        }

        while(--size2) if (*++find2 != *++str) continue;

        return (char*)str - last_index;
    }

    return NULL;
}

و الله ولي التوفيق

2

مدونتي: C++ Tips and Tricks

#11

http://www.cplusplus.com/reference/string/string/find/

اقتباس

Find content in string

Searches the string for the content specified in either str, s or c, and returns the position of the first occurrence in the string.

#include <iostream>
using std::cout;
using std::endl;

int search_string(const char *txt, const char *subText);

int main(void)
{
    cout << search_string("mohamedmeergfghfghmrtejhkjb0", "me") << endl;
	return 0;
}

int search_string(const char *txt, const char *subText)
{
        int index = -1;
	for(int i = 0; txt != '\0'; ++i)
	{
	    if(txt == subText[0])
		{
		    index = i;
			for(int j = 0; subText[j] != '\0'; ++j)
			{
			    if(txt[i + j] != subText[j])
				{
				    index = -1;
				    break;
				}
			}

			if(index >= 0) break; // = return index;
		}
	}

	return index;
}

هل لى ببعض ال test cases ؟


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#12
MOHAMED FATHEI كتب:

http://www.cplusplus.com/reference/string/string/find/

هل لى ببعض ال test cases ؟

أذا قلنا:

   search_string("Mohammed Auda", "Auda")   ;

فلمخرجات:

9
RUN SUCCESSFUL (total time: 682ms)

ممتاز الكود يعمل بشكل جيد لكن ماذا لو

أخذت حالة الاختبار هذة:

search_string("Mohammed Auda", '\0')

فالمخرجات:

RUN FAILED (exit value 1, total time: 300ms)

لا ادرى ما معنى المخرجات

من المعتاد برمجيا فى دوال البحث فى السلاسل النصية:

أم ان ترجع عنوان بداية السلسة النصية للمستخدم فى حالة ايجاد السلسلة النصية.

أو ترجع القيمة NULL أى صفر... فى حالة عدم ايجاد السلسلة النصية.

تم تعديل هذه المشاركة بواسطة AudaNix في 16 مايو 2012 في 22:01

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#13

غيرها الى

("mohamedmeergfghfghmrtejhkjb0", "\0")

اقتباس

من المعتاد برمجيا فى دوال البحث فى السلاسل النصية:

أم ان ترجع عنوان بداية السلسة النصية للمستخدم فى حالة ايجاد السلسلة النصية.

أو ترجع القيمة NULL أى صفر... فى حالة عدم ايجاد السلسلة النصية.

هل تريد ان تقول ان الدالة find المرفق رابطها تعيد *char !!!!!!!!!!

انظر الرابط مرة اخرى :)

http://www.cplusplus.com/reference/string/string/find/

تم تعديل هذه المشاركة بواسطة MOHAMED FATHEI في 16 مايو 2012 في 22:11


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#14
MOHAMED FATHEI كتب:

هل تريد ان تقول ان الدالة find المرفق رابطها تعيد *char !!!!!!!!!!

انظر الرابط مرة اخرى :)

http://www.cplusplus.com/reference/string/string/find/

فعلا معاك حق فى find وحتى السؤال بأعلاة يريد الموقع وليس العنوان .

ولكن من شدة التحام مفهوم العناوين بالسلاسل النصية انا ذكرت تعليقى.

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#15
اقتباس
("mohamedmeergfghfghmrtejhkjb0", "\0")

بطريقة أخرى . وهذة حالة واردة جدا..

const char *ch2 = NULL;
    const char *ch1 = "Mohammed Auda";
    cout << search_string(ch1, ch2) << endl;

نفس المخرجات السابقة

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

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