ورود

View Full Version : می شه تو switch از رشته استفاده کرد؟



vasilopita
سه شنبه 30 آذر 1389, 14:49 عصر
سلام. متاسفانه تا حالا کسی به دو سوال قبلیم جواب نداده. امیدورام جواب این یکی رو بدید. می شه تو switch از رشته استفاده کرد؟

char name[10];
cin>>name;
switch(name)
{

}
می دونم که برای کاراکتر شدنیه ولی واسه رشته چی ؟(امتحان کردم نمیشه)

ce_asieh
سه شنبه 30 آذر 1389, 15:16 عصر
سلام
فرقي نداره ميتوني از رشته هم استفاده کني!
string name;
cin>>name;
switch(name)
{
case "a":name += "a";
break;
case "b":name += "b";
break;


}

vasilopita
سه شنبه 30 آذر 1389, 15:58 عصر
چه عجب یکی ما رو تحویل گرفت. ce_asieh جان پس این مشکلش چیه؟ من تو c++ visual کار می کنم هان. اینم کد و ارورش :

#include<iostream>
#include<conio.h>
#include<string.h>
using namespace std;
void main()
{
char name[20];
cin>>name;
switch(name)
{
case "ali":
cout<<"ali\n";
break;
case "reza":
cout<<"reza\n";
default:
cout<<"No Name\n";
}
}
اینم ارور :

Error 2 error C2051: case expression not constant
Error 3 error C2051: case expression not constant
Error 1 error C2450: switch expression of type 'char [20]' is illegal

mehdi.mousavi
چهارشنبه 01 دی 1389, 12:25 عصر
سلام فرقي نداره ميتوني از رشته هم استفاده کني!

سلام.
خیر، چنین چیزی در C/C++ میسر نیستش. شما تنها اجازه دارید تا از مقادیر integral یا enum type ها در switch استفاده کنید.
دلیلش هم واضحه، چون ما در این زبان Primitive ای به اسم string نداریم و کامپایلر هیچ Sense ای از اینکه string رو چطور میتونه با یه string دیگه مقایسه کنه نداره. (string، فقط آرایه ای از TCHAR هاست).


می دونم که برای کاراکتر شدنیه ولی واسه رشته چی ؟(امتحان کردم نمیشه)

بله، برای اینکه Character ها جزء Primitive ها هستن (یا همون integral ها). اما برای رفع مشکل چیکار میشه کرد؟ چند تا راه وجود داره:


یکی اینکه یه تابع برای Hash کردن String بنویسید و جای اینکه روی خود string سوئیچ مورد نظر رو بذارید، روی Hash اش (که یه integer میشه) اینکارو کنید.
می تونید از Map ای از enum ها و string های مورد نظر استفاده کنید. بدین ترتیب سوئیچ مورد نظر رو روی enum می نویسید.
داده های مورد نظر رو می تونید در یک XML نگهداری کنید و با استفاده از XPATH و بدون نیاز به switch به هدفتون برسید.
می تونید از if استفاده کنید.
و ...

موفق باشید.

پاورقی: اینکه کدامیک از روشهای فوق رو انتخاب می کنید، کاملا به مساله ای ربط داره که در دست دارید. اگر تعداد مقادیر شما یکی دو تا هستش، if انتخاب مناسبیه. در غیر اینصورت فکر میکنم map یا xml ها انتخاب بهتری باشن، خصوصا اگر اطلاعاتی مضاعف در مورد هر entry نیز داشته باشید، که در این صورت، XML به ردیف اول انتخاب ها میاد...

vasilopita
پنج شنبه 02 دی 1389, 16:49 عصر
آخه انگار if هم رشته رو نمی شناسه ؟

mehdi.mousavi
پنج شنبه 02 دی 1389, 17:03 عصر
آخه انگار if هم رشته رو نمی شناسه ؟

سلام.
شما باید از _tcscmp (http://msdn.microsoft.com/en-us/library/e0z9k731.aspx)، (یا دیگر نسخه های این تابع) برای مقایسه دو رشته استفاده کنید.
به مثالی که در لینک فوق اومده دقت کنید تا پاسخ سوالتون رو بگیرید.

موفق باشید.