PDA

View Full Version : مشکل با strcmp



Sasy360
سه شنبه 05 خرداد 1388, 01:57 صبح
من تو هر برنامه ای که مینویسم با این strcmp مشکل دارم.
این یه برنامه سادست که با اشاره گر های دو بعدی کار میکنه

#include <iostream>
#include <cstring>
using namespace std;
char *keyword[][2]= {
"for","for syntax",
"if","if syntax",
"while","while syntax"
};
int main(int argc, char** argv)
{
char str[80];
int i;
cout<<"Enter syntax";
cin>>str;
for(i=0;*keyword[i][0];i++)
if(!strcmp(*keyword[i][0],str))
cout<<"cout[i][1]";
return 0;
}این هم خطاها و اخطار های برنامه

g++ -Wall -c "keyword synopsis.cpp" (in directory: /home/sasan)
keyword synopsis.cpp:30: warning: missing braces around initializer for ‘char* [2]’
keyword synopsis.cpp:30: warning: missing braces around initializer for ‘char* [2]’
keyword synopsis.cpp:30: warning: missing braces around initializer for ‘char* [2]’
keyword synopsis.cpp:30: warning: deprecated conversion from string constant to ‘char*’
keyword synopsis.cpp:30: warning: deprecated conversion from string constant to ‘char*’
keyword synopsis.cpp:30: warning: deprecated conversion from string constant to ‘char*’
keyword synopsis.cpp:30: warning: deprecated conversion from string constant to ‘char*’
keyword synopsis.cpp:30: warning: deprecated conversion from string constant to ‘char*’
keyword synopsis.cpp:30: warning: deprecated conversion from string constant to ‘char*’
keyword synopsis.cpp: In function ‘int main(int, char**)’:
keyword synopsis.cpp:38: error: invalid conversion from ‘char’ to ‘const char*’
keyword synopsis.cpp:38: error: initializing argument 1 of ‘int strcmp(const char*, const char*)’
Compilation failed.
چه جوری باید از این strcmp درست استفاده کرد؟ آرایه اشاره گرها رو چه جوری درست مقدار بدم که خطا نگیره؟
راستی من از Geany 0.17 و آخرین نسخه GCC روی اوبونتو استفاده میکنم.

mabbaszadegan
سه شنبه 05 خرداد 1388, 21:39 عصر
strcmp رو فکر نکنم برای آرایه دو بعدی بشه استفاده کرد!!!
در ضمن فکر کنم نحوه تعریف keyword اشتباه باشه؟!!

tdkhakpur
چهارشنبه 06 خرداد 1388, 00:08 صبح
سلام
برنامه ات رو بصورت دستی اصلاح میکنم خودت اجراش کن و ایرادت رو باهاش مقایسه کن .(ولی برنامه شما چه معنی میده.)
به هر حال موفق باشید.


#include <iostream>
#include <cstring>
using namespace std;
char *keyword[6]= {
"for","for syntax",
"if","if syntax",
"while","while syntax"
};
int main(int argc, char** argv)
{
char str[80];
int i;
cout<<"Enter syntax";
cin>>str;
for(i=0;keyword[i];i++)
if(!strcmp(keyword[i],str))
cout<<"cout[i][1]";
return 0;
}

Sasy360
چهارشنبه 06 خرداد 1388, 01:04 صبح
strcmp رو فکر نکنم برای آرایه دو بعدی بشه استفاده کرد!!!چرا نشه؟ حالا هر چند بعدی هم بخواد باشه مقدار مورد اشاره اونجا قرار میگیره. این strcmp اصلا انگار نمی تونه مقایسه رو رو اشاره گر انجام بده.

در ضمن فکر کنم نحوه تعریف keyword اشتباه باشه؟!!چه جوری میشه درست تعریفش کرد که اخطار هم نده؟

سلام
برنامه ات رو بصورت دستی اصلاح میکنم خودت اجراش کن و ایرادت رو باهاش مقایسه کن .(ولی برنامه شما چه معنی میده.)
به هر حال موفق باشید.
والا من نمیدونم شما چیکار کردید. بیشتر شبیه اینه که صورت مساله که مشکل مقایسه strcmp هست رو پاک کردید. به هر حالا ممنون از کمک تون.

tdkhakpur
چهارشنبه 06 خرداد 1388, 12:16 عصر
سلام:

بیشتر شبیه اینه که صورت مساله که مشکل مقایسه strcmp هست رو پاک کردید
یعنی چی خوب برنامه ات همونه دیگه.

Sasy360
چهارشنبه 06 خرداد 1388, 17:48 عصر
یعنی چی خوب برنامه ات همونه دیگه.
این برنامه با استفاده از آرایه دو بعدی هر دستور تو c پلاس پلاس رو که بهش بدی یه توضیح در موردش چاپ میکنه. شما اومدی آرایه رو تک بعدی تعریف کردی و بعد میخوای دو بعدی چاپش کنی؟!

tdkhakpur
چهارشنبه 06 خرداد 1388, 18:47 عصر
سلام
نمیدونم چرا بهت جواب میدم اما شما هیچ چیز از برنامه نویسی نمیدونید که هیچ - شرط ادب رو هم بلد نیستید.
ببین دوست ارجمند شما برنامتون بکلی ایراد داشت کار به بی مفهوم بودنش ندارم فقط من برنامه شما رو اصلاح کردم . اصلا کار شما در حد برنامه نیست.
ببین من نه سایر دوستان بالاخره یه کاری بکنید که اگه باز مشکلی براتون پیش اومد جواب بدیم.
از دوستا اگه کسی هست لطف کنن آقا رو راهنمایی کن شاید ما سوادش رو نداشتیم و اشتباه کردیم.

Sasy360
چهارشنبه 06 خرداد 1388, 19:04 عصر
سلام
نمیدونم چرا بهت جواب میدم اما شما هیچ چیز از برنامه نویسی نمیدونید که هیچ - شرط ادب رو هم بلد نیستید.
ببین دوست ارجمند شما برنامتون بکلی ایراد داشت کار به بی مفهوم بودنش ندارم فقط من برنامه شما رو اصلاح کردم . اصلا کار شما در حد برنامه نیست.
ببین من نه سایر دوستان بالاخره یه کاری بکنید که اگه باز مشکلی براتون پیش اومد جواب بدیم.
از دوستا اگه کسی هست لطف کنن آقا رو راهنمایی کن شاید ما سوادش رو نداشتیم و اشتباه کردیم.
دوست عزیز [ببخشید اسمتون رو نمیدونم] من به هیچ وجه قصد توهین نداشتم و ندارم اگه شما این جوری از حرف های من برداشت کردید و ناراحت شدید من شرمندم و باید بگم که منو ببخش.
نه گفتم برنامه نویسم و نه گفتم این کد ها برنامه هست. فقط گفتم با strcmp مشکل دارم یه نمونه هم گزاشتم که کاربر ها ببینند.
بازم ببخشید.
راستی چرا برنامه من بی معنی‌ه؟

tdkhakpur
چهارشنبه 06 خرداد 1388, 19:09 عصر
سلام
ببینید کد زیر برنامتون رو بی معنی کرده


cout<<"cout[i][1]";

بصورت زیر اگه خواستید اصلاحش کنید.


cout<<keyword[i];

Sasy360
چهارشنبه 06 خرداد 1388, 19:38 عصر
سلام
ببینید کد زیر برنامتون رو بی معنی کرده


cout<<"cout[i][1]";
بصورت زیر اگه خواستید اصلاحش کنید.


cout<<keyword[i];

بله اینجاش حق با شماست این کدی که من نوشتم مستقیم میاد cout[i][1] رو چاپ میکنه! ولی با تغیر این هم و حتی تک بعدی کردن اون اشاره گره [که اصل برنامه همونه] همون ارور های اول سر جاشونه

Saeed_m_Farid
چهارشنبه 06 خرداد 1388, 19:47 عصر
سلام
نمیدونم چرا بهت جواب میدم اما شما هیچ چیز از برنامه نویسی نمیدونید که هیچ - شرط ادب رو هم بلد نیستید.
ببین دوست ارجمند شما برنامتون بکلی ایراد داشت کار به بی مفهوم بودنش ندارم فقط من برنامه شما رو اصلاح کردم . اصلا کار شما در حد برنامه نیست.
ببین من نه سایر دوستان بالاخره یه کاری بکنید که اگه باز مشکلی براتون پیش اومد جواب بدیم.
از دوستا اگه کسی هست لطف کنن آقا رو راهنمایی کن شاید ما سوادش رو نداشتیم و اشتباه کردیم.
مگه Sasy360 چي گفت كه اين حرفا رو بهش زدين؟ اگه كسي يه قسمت از تو ضيح شما رو متوجه نشه؛ بايد اين برخورد رو كرد باهاش؟ يه بار ديگه اون توافقنامه كه از طريقش عضو سايت شدين رو بخونيد؛ اين جور پست دادن خلاف قوانين سايته ...


این برنامه با استفاده از آرایه دو بعدی هر دستور تو c پلاس پلاس رو که بهش بدی یه توضیح در موردش چاپ میکنه. شما اومدی آرایه رو تک بعدی تعریف کردی و بعد میخوای دو بعدی چاپش کنی؟!
اين پست ايشون بود و حقم داشتن، شما (tdkhakpur) منظور برنامه رو متوجه نشدين و پست تون هم در راستاي سوال ايشون نبود.


به هر صورت : Sasy360 اشتباهات شما اينها هستند :
اولا : به جاي
for(i=0;*keyword[i][0];i++)
if(!strcmp(*keyword[i][0],str))
بايد به عضو اول آرايه دوبعدي نگاه كنيد :
for(i=0; i < 3; i++)
if(!strcmp(*keyword[i], str))


ثانيا : موقع چاپ بايد عضو دوم رو چاپ كنيد نه يه رشته يعني به جاي
cout<<"cout[i][1]";
بايد بذاريد :
cout<<keyword[i][1];

اگه هم ميخواين keyword هاتون رو بعدا كم و زياد كنيد بايد شرط for رو
strlen(*keyword[i]) > 0 بذاريد.

موفق باشيد ...

tdkhakpur
چهارشنبه 06 خرداد 1388, 21:13 عصر
:تشویق:جناب Saeed_m_Farid (http://barnamenevis.org/forum/member.php?u=41415) :
مگه قانون میگه شما حرف دروغ بزنید.
شما اگه یه لطفی برای این دوستمون انجام بدید و همون برنامه رو براش با توضیح اصلاح کنید.
من به ایشون نتونستم کمک کنم امیدوارم من رو ببخشه. مرســــــــی

Sasy360
چهارشنبه 06 خرداد 1388, 22:05 عصر
Saeed_m_farid عزیز واقعا ممنون. آخر کار کرد.
ولی من هنوز یه چیزی رو نفهمیدم! این keyword مگه اشاره گر نبود؟ چرا موقع چاپ * رو نزاشتیم؟ یعنی اون جایی که keyword داره بش اشاره می کنه؟

مگه Sasy360 چي گفت كه اين حرفا رو بهش زدين؟ اگه كسي يه قسمت از تو ضيح شما رو متوجه نشه؛ بايد اين برخورد رو كرد باهاش؟ يه بار ديگه اون توافقنامه كه از طريقش عضو سايت شدين رو بخونيد؛ اين جور پست دادن خلاف قوانين سايته ...من 4 ساله که در فروم های مختلف فعالم. از این سوء تفاهم ها زیاد پیش میاد.

Saeed_m_Farid
پنج شنبه 07 خرداد 1388, 02:34 صبح
این keyword مگه اشاره گر نبود؟ چرا موقع چاپ * رو نزاشتیم؟
فرقي نمكنه كه شما از * استفاده كنيد يا انديس، در حقيقت انديس يه نوع نمايش ديگه از * هست يعني دو كد زير يه معني ميدن :


cout<<keyword[i][1];
===================
cout<<*(keyword[i]+1);
يا
cout<<keyword[i][0];
===================
cout<<*keyword[i];