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

[ تمت الإجابة ]سؤال عن مقارنة الـString في لغة C++

بدأه zizo++ في 16 أغسطس 2012 · 8 رد · 8,342 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

يـــوم ســـعـــيـــد عـــلــــيــــكـــم جــمـــيــعـــا أخــوانــي وأخـــواتـــي فــــي الــفـــريـــق الـــعــربـــي للــبـــرمــجــة :salam: :salam:

واجهتني مشكلة في كيفية التعامل مع الـString في لغة C++ عند كتابة برنامج معين :cry: ,,

ولذلك كتبت فكرة المشكلة في برنامج صغير ليتسنى لحضراتكم الكرام الاطلاع على المشكلة حصرا دون الانشغال بالبرنامج الكبير الذي اكتبه,,

وهذا هو الكود البرمجي للبرنامج:

#include<iostream.h>
#include<conio.h>
void main(){
char x[9];
cout<<"Enter the name: ";
cin>>x;
cout<<x<<endl;
if(x=="IRAQ")
cout<<"Match";
else
cout<<"Difference";
getch();
}

وعند التنفيذ, ولنفرض ادخلنا بداية كلمة (IRAQ), ستتنفذ الجملة في السطر السابع وتظهر الكلمة على الشاشة,,

لكن عند عملية المقارنة في السطر الثامن سنلاحظ ان الكلمتين لم يتطابقا (لم تنفذ جملة if, وبدلا من ذلك ستنفذ جملة else), بدلالة ان الاخراج سيكون كلمة (Difference)!!!! :hmm:

وهنا سؤالي: لماذا البرنامج لم يستطع معرفة ان الكلمتين متطابقتان في جملة المفارنة (if) ؟؟!! :mad: :tantrum:

وجربت بأن أضيف الحرف (\0) الى نهاية الكلمة في جملة المقارنة (الحرف الخامد) لكني لم افلح في الحصول على مرادي,, :wacko: :blink:

تم تعديل هذه المشاركة بواسطة Xacker في 16 أغسطس 2012 في 04:47

#2

مرحبا أختي الكريمة :)

بداية, أنتِ لم تستعملي النوع string في الكود, بل استخدمتِ مصفوفة حرفية (من نوع char). و سبب الخطأ في الكود يعود إلى أن المؤثر == غير مُعرف لدى مصفوفات char.

يُمكنك استخدام النوع string الذي يدعم مؤثر المقارنة:

#include<iostream>
#include <string>
using namespace std;
int main()
{
    string nom;
    cout<<"entrez votre nom:";
    cin>>nom;
    if(nom=="IRAQ") cout<<"Match";
    else cout<<"Difference";
    return 0;
}

أيضا, جواب سؤالك موجود في موضوع الأسئلة الأكثر شيوعا في لغة C الذي كتبه الأخ المشرف أحمد الشنقيطي.

انظري:

اقتباس
كيف نقارن السلاسل الحرفية ؟

لا تستخدم المعامل == في المقارنة. استخدم الدالة strcmp لمثل هذا الأمر, إذا كنت تريد مقارنة جزء معين من السلسلة الحرفية فيمكنك استخدام الدالة strncmp, توجد ثلاث حالات:

  • القيمة 0 تعني أن السلسلتين متساويتين.
  • القيمة السالبة تعني أن السلسلة الحرفية الأولى تحتوي على حروف ترميزها بالـ ASCII أصغر من ترميز حروف السلسلة الثانية.
  • القيمة الموجبة تعني أن السلسلة الحرفية الأولى تحتوي على حروف ترميزها بالـ ASCII أكبر من ترميز حروف السلسلة الثانية.

const char * chaine1 = "blabla";
const char * chaine2 = "blabla";
const char * chaine3 = "blablu";
if (strcmp(chaine1, chaine2) == 0) {
    /* les chaines sont identiques */
}
if (strcmp(chaine2, chaine3) != 0) {
    /* les chaines sont différentes */
}
if (strncmp(chaine2, chaine3, 3) == 0) {
    /* les chaines sont identiques en se limitant a comparer les 3 premiers caracteres */
}

أخيرا, أخبرني الأخ أحمد البارحة بوفاة ابن عمه الأصغر في حادث مؤلم لذا لا تنسوه من صالح الدعاء.

3
#3

مــرحــبـــا بـــك أخــــي الــعـــزيــــز خــالــد,, :rose:

بداية أنا ((أخوك الكريم)) وليس كما أوهمك اسمي المستعار بأختك الكريمة :blush: :blush: :D

وأما عن البرنامج الاول فعند التنفيذ فأن الـCompiler يعترض على تعريف من نوع String,, فقد حاولت ذلك قبلا وكذلك الان من جديد ولم ينجح الامر,, (نجحت هذه الطريقة معي في لغة Java فقط),, وقد لاحظت ان كثيرين من المبرمجين يستعيضون عن هذا الامر بالـمصفوفة من النوع char ,,

واما عن البرنامج الثاني فقد نجحت معي هذه الطريقة :clapping: ,, وبصراحة فاتني ملاحظة الموضوع المذكور سابقا,,

واخيرا فالشكر الجزيل موصول لشخصك الكريم, وللاستاذ أحمد الشنقيطي الذي ندعو لابن عمه بجنة الخلود, ولعائلته الصبر والسلوان,,

تحياتي....

#4
اقتباس
بداية أنا ((أخوك الكريم)) وليس كما أوهمك اسمي المستعار بأختك الكريمة

عفوا أخي, مرحبا بك

اقتباس
وأما عن البرنامج الاول فعند التنفيذ فأن الـCompiler يعترض على تعريف من نوع String,, فقد حاولت ذلك قبلا وكذلك الان من جديد ولم ينجح الامر

إذا, أنت تعمل على IDE لا يدعم مساحة الأسماء std

ماسم الــ IDE الذي تعمل عليه ؟ و مارقم النسخة ؟

#5
zizo++ كتب:

يـــوم ســـعـــيـــد عـــلــــيــــكـــم جــمـــيــعـــا أخــوانــي وأخـــواتـــي فــــي الــفـــريـــق الـــعــربـــي للــبـــرمــجــة :salam: :salam:

واجهتني مشكلة في كيفية التعامل مع الـString في لغة C++ عند كتابة برنامج معين :cry: ,,

ولذلك كتبت فكرة المشكلة في برنامج صغير ليتسنى لحضراتكم الكرام الاطلاع على المشكلة حصرا دون الانشغال بالبرنامج الكبير الذي اكتبه,,

وهذا هو الكود البرمجي للبرنامج:

#include<iostream.h>
#include<conio.h>
void main(){
char x[9];
cout<<"Enter the name: ";
cin>>x;
cout<<x<<endl;
if(x=="IRAQ")
cout<<"Match";
else
cout<<"Difference";
getch();
}

وعند التنفيذ, ولنفرض ادخلنا بداية كلمة (IRAQ), ستتنفذ الجملة في السطر السابع وتظهر الكلمة على الشاشة,,

لكن عند عملية المقارنة في السطر الثامن سنلاحظ ان الكلمتين لم يتطابقا (لم تنفذ جملة if, وبدلا من ذلك ستنفذ جملة else), بدلالة ان الاخراج سيكون كلمة (Difference)!!!! :hmm:

وهنا سؤالي: لماذا البرنامج لم يستطع معرفة ان الكلمتين متطابقتان في جملة المفارنة (if) ؟؟!! :mad: :tantrum:

وجربت بأن أضيف الحرف (\0) الى نهاية الكلمة في جملة المقارنة (الحرف الخامد) لكني لم افلح في الحصول على مرادي,, :wacko: :blink:

مرحبا

ربما لم تلاحظ بأنك وضعت مسافة زائدة أنظر لهذا السطر

cout<<"Enter the name: ";

الصواب

cout<<"Enter the name:";

الكود كامل المقارنة تتم بطريقة سليمة مالو كانت بالطبع الأحرف متماثلة

لأن مرجع C++ حساس لحالة الأحرف

void main(){
char x[9];
cout<<"Enter the name:";
cin>>x;
cout<<x<<endl;
if(x=="IRAQ")
cout<<"Match";
else
cout<<"Difference";
getch();
}

و كذلك ملاحظات من سبقني ليست خاطئة و الأفضل عند مقارنة

السلاسل أو النصوص استخدام الوظيفة المخصصة لذلك و هي

http://www.cplusplus.com/reference/clibrary/cstring/strcmp/

int strcmp ( const char * str1, const char * str2 );

و هذا مثال كامل باستخدام الوظيفة السابقة بالطبع مع توحيد حالة الأحرف

char* StrToUpper(char* iString);
void main(){
char x[9];
cout<<"Enter the name:";
cin>>x;
cout<<x<<endl;
if(strcmp(StrToUpper(x),"IRAQ") == 0)
cout<<"Match";
else
cout<<"Difference";
getch();
}

char* StrToUpper(char* iString)
{
if (iString == NULL) return iString;
int vLen = strlen(iString);
char* pString = new char[vLen + 1];
for (int i = 0 ; i < vLen; i++)
{pString = toupper(iString);}
pString[vLen] = '\0';
return pString;
}

شكرا

1

Wolf_Oman

صرح السماء

wolf9228

ناقوس الخطر

#6

السلام عليكم

اقتباس
ربما لم تلاحظ بأنك وضعت مسافة زائدة أنظر لهذا السطر

لا أظن أن هذا هو سبب المشكلة ..

الأصل أنه لا يُمكن مُقارنة المصفوفات باستخدام المؤثر == كما قال الأخ خالد.

بالنسبة لسبب ظهور تلك المُخرجات, فأرى أن الكلمة IRAQ (أو الكلمة المُدخلة بشكل عام) تظهر بسبب المقارنة, أما الكلمة Difference فتظهر نتيجة تنفيذ الــ else. لأن x تختلف دائما عن IRAQ.

جرب هذا الكود:

#include<iostream>
using namespace std;

int main() {
    char x[9];
    cout << "Enter the name:";
    cin >> x;
    cout << x << endl;
    bool NewVar = (x == "IRAQ");
    cout << NewVar;
    return 0;
}

ثم جرب هذا:

#include<iostream>
using namespace std;

int main() {
    char str1[] = "IRAQ", str2[] = "ArabTeam";
    bool NewVar = (str1 == str2);
    cout << NewVar;
    return 0;
}

هل لاحظت الفرق ؟

اقتباس

الكود كامل المقارنة تتم بطريقة سليمة مالو كانت بالطبع الأحرف متماثلة

لأن مرجع C++ حساس لحالة الأحرف

void main(){
char x[9];
cout<<"Enter the name:";
cin>>x;
cout<<x<<endl;
if(x=="IRAQ")
cout<<"Match";
else
cout<<"Difference";
getch();
}

كما ذكر الأخ خالد, المصفوفات عبارة عن أنواع مُركبة (Complex Types) و بالتالي لا يمكنك أن تقول للكومبايلر أن يقارن مصفوفة من عشرة عناصر وكأنها كتلة واحدة !

الأنواع المُركبة (Arrays, structures, unions, classes, etc) لاتُقارن إلا عنصرا بعنصر.

اقتباس
و هذا مثال كامل باستخدام الوظيفة السابقة بالطبع مع توحيد حالة الأحرف

طريقة أخرى لمحاكاة strcmp :

int str_cmp(char str_1[], char str_2[]) {
    int i = 0;
    while (str_1 || str_2)
        if (str_1 != str_2[i++]) return -1;
    return 0;
}
2
#7
أحمد الشنقيطي كتب:

السلام عليكم

لا أظن أن هذا هو سبب المشكلة ..

الأصل أنه لا يُمكن مُقارنة المصفوفات باستخدام المؤثر == كما قال الأخ خالد.

بالنسبة لسبب ظهور تلك المُخرجات, فأرى أن الكلمة IRAQ (أو الكلمة المُدخلة بشكل عام) تظهر بسبب المقارنة, أما الكلمة Difference فتظهر نتيجة تنفيذ الــ else. لأن x تختلف دائما عن IRAQ.

جرب هذا الكود:


using namespace std;

int main() {
char x[9];
cout << "Enter the name:";
cin >> x;
cout << x << endl;
bool NewVar = (x == "IRAQ");
cout << NewVar;
return 0;
}
#include<iostream>

ثم جرب هذا:


using namespace std;

int main() {
char str1[] = "IRAQ", str2[] = "ArabTeam";
bool NewVar = (str1 == str2);
cout << NewVar;
return 0;
}
#include<iostream>

هل لاحظت الفرق ؟

كما ذكر الأخ خالد, المصفوفات عبارة عن أنواع مُركبة (Complex Types) و بالتالي لا يمكنك أن تقول للكومبايلر أن يقارن مصفوفة من عشرة عناصر وكأنها كتلة واحدة !

الأنواع المُركبة (Arrays, structures, unions, classes, etc) لاتُقارن إلا عنصرا بعنصر.

طريقة أخرى لمحاكاة strcmp :


int i = 0;
while (str_1 || str_2)
if (str_1 != str_2[i++]) return -1;
return 0;
}
int str_cmp(char str_1[], char str_2[]) {

مرحبا أخي أحمد عيدك و عيد الجميع مبارك

لم أقل بأن ما كتبه أخونا خالد خاطئ

اقتباس

و كذلك ملاحظات من سبقني ليست خاطئة و الأفضل عند مقارنة

السلاسل أو النصوص استخدام الوظيفة المخصصة لذلك و هي

حسبت المسافة الزائدة من ضمن بيانات الإدخال و المؤكد من أنها ليست السبب

و أعتذر لأني قمت بعمل عدة محاولات للمقارنة و ربما و أنا أحاول اختلط علي الأمر

فحسبت الكود السابق التالي يعطي نتيجة مقارنة سليمة و هو على نقيض ذلك

اعتذر لا استخدم برامج الوحدة المركزية إلا نادرا .


void main(){
char x[9];
cout<<"Enter the name:";
cin>>x;
cout<<x<<endl;
if(x=="IRAQ")
cout<<"Match";
else
cout<<"Difference";
getch();
}

شكرا على المعلومات و التي أفدتنا بها ... تحية .

تم تعديل هذه المشاركة بواسطة Wolf_Oman في 20 أغسطس 2012 في 00:50

Wolf_Oman

صرح السماء

wolf9228

ناقوس الخطر

#8

العضو zizo++ إن جواب الاخ Khaled_prg هو حل صحيح بالاضافة الى الاعضاء الاخرين فقط اضف الحرف c قبل string ليصبح <cstring> كما في ادناه

#include<iostream>

#include <cstring>

using namespace std;

int main()

{

string nom;

cout<<"entrez votre nom:";

cin>>nom;

if(nom=="IRAQ") cout<<"Match";

else cout<<"Difference";

return 0;

}

#9

My Oracle@

يُمكن استخدام المكتبات الخاصة بــ C في كود C++ حيث يُسمى هذا الأسلوب بــ Old-Style و هو موجود للتكامل مع الـ C :)

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