আমি কীভাবে সিটিতে স্ট্রিংগুলি `সুইচ` স্টেটমেন্ট ব্যবহার করে তুলনা করতে পারি?


85

সি-তে এমন একটি switchনির্মাণ রয়েছে যা পরীক্ষার পূর্ণসংখ্যার মানের উপর ভিত্তি করে কোডের বিভিন্ন শর্তসাপেক্ষ শাখা সম্পাদন করতে সক্ষম করে, যেমন,

স্ট্রিং ভ্যালু অর্থাৎ ক এর জন্য একই আচরণ (যেমন তথাকথিত " if- elseমই" এড়ানো ) কীভাবে পাওয়া সম্ভব char *?


"সুইচ অন" বলতে কী বোঝ?
কেনেটিএম

দয়া করে সংশোধন করুন যাতে আপনি প্রকৃতপক্ষে যা করার চেষ্টা করছেন (বা জিজ্ঞাসা করছেন) প্রশ্নটি পরিষ্কার হয়ে যায়।
onআইমন

9
ওপি সম্ভবত একটি স্যুইচ স্টেটমেন্টের প্যারামিটার হিসাবে একটি স্ট্রিং ব্যবহার করতে চায়। আমি যতদূর জানি, এটি সম্ভব নয়।
dandan78

উত্তর:


104

যদি আপনি বোঝাতে চান তবে কীভাবে এর মতো কিছু লিখবেন:

তারপরে সি-তে মূল সমাধানটি হ'ল যদি-অন্য কোনও মই ব্যবহার করা হয়:


4
প্রকৃতপক্ষে, সমস্যাটি হ'ল আমার কাছে ইতিমধ্যে ইন্ট একটি সুইচ আছে এবং একটি বিশেষ ক্ষেত্রে আমার কাছে "বি 1" এবং "বি 2" মান রয়েছে যা আমি একই স্যুইচটিতে ব্যবহার করতে চাই। একমাত্র উপায় হ'ল কোনওভাবে "বি 1" এবং "বি 2" মানগুলিকে রূপান্তর করা এবং সেগুলি ইনট হিসাবে ব্যবহার করা যায়?
নিক্লাস

4
@ নিক্লাস: এটি আপনার প্রশ্নের গুরুত্বপূর্ণ তথ্য। আপনি যা করতে চাইছেন তা কি আপনি নিজের প্রশ্ন আপডেট করতে এবং কিছু (সিউডো- কোড দিয়ে সম্ভব হলে) ব্যাখ্যা করতে পারেন?
বার্ট ভ্যান ইনজেন শেেনা

4
@ নিক্লাস: আপনার আপনার প্রশ্নটি স্পষ্ট করা উচিত: পৃথিবীতে কীভাবে "বি 1" এবং "বি 2" কোনও আন্তঃকরণের একটি বিশেষ ঘটনা হতে পারে?
এডগার বোনেট

4
# ডিফাইন এ 1 # ডিফাইন বি 2 # ডিফাইন সি এস 1 # ডিফাইন ডি এস 2 এবং এই মানগুলি আমি আমার সুইচে ব্যবহার করতে চাই। এত সহজ :-)
নিক্লাস

4
@ নিক্লাস: সংজ্ঞায়িত করা স্ট্রিং নয়। সংজ্ঞাটি যদি কোনও সংখ্যার জন্য হয় তবে আপনি এটি আপনার সুইচটিতে সরাসরি এটি ব্যবহার করতে পারেন switch (something) { case A: /*...*/ break; case B: /*...*/ break; }
বার্ট ভ্যান ইনজেন শেনাও

46

আপনার যদি অনেকগুলি মামলা থাকে এবং একটি টন strcmp()কল লিখতে না চান তবে আপনি কিছু করতে পারেন:

আপনাকে কেবল নিশ্চিত করতে হবে যে স্ট্রিংয়ের সম্ভাব্য মানগুলির সেটের মধ্যে আপনার হ্যাশ ফাংশনের কোনও সংঘাত নেই।


9
"আপনার হ্যাশ ফাংশনটির স্ট্রিংয়ের জন্য সম্ভাব্য মানগুলির সেটের মধ্যে কোনও সংঘর্ষ নেই তা নিশ্চিত করুন।" - বর্ণমালার জন্য কি এমন হ্যাশ ফাংশন বিদ্যমান [a-zA-Z0-9_]? কোন উদাহরণ?
অরুণ

8
@ অরুণসাহা: স্পষ্টতই এই জাতীয় চরিত্রগুলির যথেচ্ছ সংমিশ্রণের জন্য নয়।
এডগার বোনেট

4
যদি আপনি স্থির দৈর্ঘ্যের স্ট্রিং কীগুলি ব্যবহার করেন তবে আপনি সেগুলিকে প্রতিটি অনন্য পূর্ণসংখ্যায় রূপান্তর করতে পারেন; কোন সংঘর্ষ সম্ভব।
ইঞ্জিনিয়ার

@ আর্কেনেজিনিয়ার আম ... প্রশ্নটি সঠিক সমাধান করার চেষ্টা করছে না? কেবলমাত্র স্ট্রিংটি দেওয়া কীভাবে আপনি এটির সাথে যেতে কোনও পূর্ণসংখ্যা বেছে নেবেন? "একটি স্যুইচ ব্যবহার করুন বা যদি / অন্য মই" আপনি সম্ভবত 4 টি অক্ষরের মতো খুব ছোট কিছু বোঝাতে চাইছেন?
ebyrob

@ebyrob আমি দ্রুত ওপিতে তুলনামূলক যে কোনও কিছুই বোঝাতে চাইছি, যেমন 2 -৪-বিট uintএস যার বিটগুলিকে 8 1-বাইট এএসসিআইআই হিসাবে বিবেচনা করা হয় char। আমি সি এর একটি হ্যাশ টেবিলের মধ্যে মূল তুলনাগুলির জন্য কিছুক্ষণ আগে এটি প্রয়োগ করেছি thus আপনি এইভাবে কোনও হ্যাশিং বা বালতিগুলির প্রয়োজনীয়তা মুছে ফেলেন। আপনার যেখানে 64 বিট অতিক্রম করতে হবে সেখানে সমস্যাটি আসে; আপনি charসম্পূর্ণ স্ট্রিংয়ে 8 টির প্রতিটি সেট লুপ করার সাথে সাথে আপনি শর্তাবলীর জন্য মূল্য পরিশোধ করুন । আপনি যদি লুপটি আনরোল না করেন তবে আপনি কীগুলির সর্বোচ্চ আকার জানেন। এটি একটি সূক্ষ্ম ভারসাম্যমূলক কাজ।
ইঞ্জিনিয়ার

40

সি তে এটি করার কোনও উপায় নেই অনেকগুলি ভিন্ন ভিন্ন পদ্ধতি রয়েছে। সাধারণত সবচেয়ে সহজ হল ধ্রুবকগুলির একটি সেট সংজ্ঞায়িত করা যা আপনার স্ট্রিংগুলিকে উপস্থাপন করে এবং ধ্রুবকটি পেতে স্ট্রিংয়ের সাহায্যে এক নজর করা:

এটি করার জন্য আরও কার্যকরী উপায় অবশ্যই রয়েছে। আপনি যদি আপনার কীগুলি বাছাই করে রাখেন তবে আপনি বাইনারি অনুসন্ধান ব্যবহার করতে পারেন। আপনি একটি হ্যাশ টেবিলও ব্যবহার করতে পারেন। এই জিনিসগুলি রক্ষণাবেক্ষণ ব্যয়ে আপনার কর্মক্ষমতা পরিবর্তন করে change


7
কীগুলির জন্য # ডিফাইনগুলির একটি সেটের পরিবর্তে এনাম ব্যবহার করা খুব ভাল, তবে অন্যথায় আপনি যা করতে পারেন তার সেরা about
ক্রেগ রিঞ্জার

ইনক্রিমেন্টিং ভুল। অনুসন্ধানযোগ্য টেবিল + i * আকারের (t_symstruct) ল্যাচটিউটেবলের সমান নয় [i]।
এসিডেফ

@ এসডিএফ সি তে পয়েন্টার পাটিগণিত এইভাবে কাজ করে। আকারটি অন্তর্নিহিত।
22

20

এটি করার জন্য আমার পছন্দসই পদ্ধতিটি হ্যাশ ফাংশনের মাধ্যমে ( এখান থেকে ধার করা )। চর * এর সাথে কাজ করার সময়ও এটি আপনাকে একটি স্যুইচ স্টেটমেন্টটির দক্ষতা কাজে লাগাতে দেয়:

অবশ্যই, এই পদ্ধতির জন্য প্রয়োজনীয় সমস্ত সম্ভাব্য গৃহীত গৃহস্থালীর জন্য হ্যাশ মানগুলি আগাম গণনা করা দরকার। আমি মনে করি না এটি কোনও ইস্যুর খুব বেশি; তবে, যেহেতু স্যুইচ বিবৃতি নির্ধারিত নির্ধারিত মানগুলিতে কাজ করে। হ্যাশ ফাংশনটির মাধ্যমে চরটি পাস করতে এবং তাদের ফলাফলগুলি আউটপুট করার জন্য একটি সাধারণ প্রোগ্রাম তৈরি করা যেতে পারে। এই ফলাফলগুলি তখন ম্যাক্রোর মাধ্যমে সংজ্ঞায়িত করা যেতে পারে যেমন আমি উপরে করেছি।


স্ট্যাক ওভারফ্লোতে আপনাকে স্বাগতম। আপনি যা দেখিয়েছেন তা নিখুঁতভাবে উপস্থাপন করা হয়েছে এবং একটি ভাল ধারণা, তবে ... তবে এটি অন্যান্য উত্তরগুলির থেকে কিছু পৃথক নয় - এমন কয়েকটি রয়েছে যা এই ধারণাটিতে ছোটখাটো রূপ ব্যবহার করে। আপনি যদি কোনও পুরানো স্থিতিশীল প্রশ্নের নতুন উত্তর যুক্ত করেন তবে আপনার খুব ভাল নিশ্চিত হওয়া উচিত যে আপনার কাছে ভাল নতুন তথ্য রয়েছে। এটি বেশিরভাগ সতর্কতার শব্দ; আমি অবশ্যই এর জন্য আপনাকে ভোট দিতে চাই না।
জোনাথন লেফলার

16

আমি মনে করি এটির সর্বোত্তম উপায় হ'ল কার্যকারিতা থেকে 'স্বীকৃতি' আলাদা:


8

আমি সি তে স্ট্রিংগুলিতে স্যুইচটি সম্পাদনের জন্য একটি শিরোনাম ফাইল প্রকাশ করেছি, এতে একটি ম্যাক্রোর সমষ্টি রয়েছে যা একটি সুইচ-জাতীয় আচরণের নকল করার জন্য স্ট্রিংকে () বা (অনুরূপ) কলটি আড়াল করে। আমি এটি লিনাক্সে কেবল জিসিসি দিয়ে পরীক্ষা করেছি, তবে আমি নিশ্চিত যে এটি অন্যান্য পরিবেশকে সমর্থন করার জন্য অভিযোজিত হতে পারে।

সম্পাদনা: অনুরোধ অনুসারে কোডটি এখানে যুক্ত করুন

এটি শিরোনাম ফাইলটি আপনার অন্তর্ভুক্ত করা উচিত:

এবং এইভাবে আপনি এটি ব্যবহার:


উদাহরণটি আমি "ব্রেক" যোগ না করে সম্পাদনা করেছি, তবে আপনি এটিকে বাদ দিতে পারেন তা তুলে ধরে
Andrea Carron

4
এটা ভাল! আমি "sscanf" ম্যাচ করার আগে, "regex.h" শিখেছি, যা স্ট্রিং
কেসগুলির

স্যুইচ / কেসের তুলনায় কী সুন্দর সমাধান, ভাল পঠনযোগ্য এবং আরও কার্যকারিতা - ধন্যবাদ! বন্ধনী বন্ধ করার পরে "স্যুইচস_েন্ড:" ভুলে যাবেন না।
আছিম

6

স্ট্রিং অনুসন্ধানটি দ্রুত সম্পাদন করার একটি উপায় রয়েছে। অনুমান: যেহেতু আমরা একটি স্যুইচ স্টেটমেন্টের কথা বলছি, আমি ধরে নিতে পারি যে রানটাইম চলাকালীন মানগুলি পরিবর্তন হবে না।

ধারণাটি হ'ল সি স্ট্ডলিবের কিউসোর্ট এবং বিসার্ক ব্যবহার করা।

আমি xtofl এর কোডে কাজ করব।


6

উপরের ফিমিউমের উত্তরে যুক্ত করতে, যদি আপনার স্ট্রিং সর্বদা দুটি অক্ষর হয় তবে আপনি দুটি 8-বিট অক্ষরের মধ্যে একটি 16-বিট ইন্টি তৈরি করতে পারেন - এবং এটি স্যুইচ করতে পারেন (নেস্টেড সুইচ / কেস স্টেটমেন্টগুলি এড়াতে)।


আপনি যদি সত্যিই চান To add to Phimueme's answer above, তবে মন্তব্য ফাংশনটি নির্দ্বিধায় ব্যবহার করুন। :)
পেঁয়াজ-নাইট

4
@ অ্যানিয়োন: আপনি লক্ষ করবেন যে মাইক্রোমের বর্তমানে তার নিজের ব্যতীত অন্য পোস্টগুলিতে মন্তব্য করার খ্যাতি নেই এবং তার নিজের প্রশ্নের উত্তর রয়েছে। এটি বলেছিল, @ মাইকের "উপরে" SO পিচ্ছিল, কারণ কোনও নির্ভরযোগ্য বাছাই-ক্রম নেই। "... ফিমিউমের উত্তরে ..." এর মতো উত্তরের সাথে লিঙ্ক করা ভাল (যদিও সেই উত্তরটি এখন মুছে ফেলা হয়েছে, এবং লিঙ্কটি কেবল 10k + খ্যাতিযুক্ত ব্যবহারকারীদের জন্য ভাল)।
dmckee --- প্রাক্তন-মডারেটর বিড়ালছানা

3

অন্যের সাথে স্ট্রিংয়ের তুলনা করার জন্য আমরা যদি-অন্য সিঁড়ি থেকে পালাতে পারি না। এমনকি নিয়মিত স্যুইচ-কেসটি অভ্যন্তরীণভাবে যদি অন্য কোনও মই হয় (পূর্ণসংখ্যার জন্য)। আমরা কেবল স্ট্রিংয়ের জন্য স্যুইচ-কেসটি অনুকরণ করতে চাই, তবে অন্য-মই যদি কখনও প্রতিস্থাপন করতে পারি না। স্ট্রিং তুলনার জন্য অ্যালগরিদমগুলির সেরাটি স্ট্রিংসিএমপি ফাংশন ব্যবহার থেকে বাঁচতে পারে না। চরিত্র অনুসারে চরিত্রের তুলনা করার অর্থ কোনও মিল নেই যতক্ষণ না পাওয়া যায়। সুতরাং if-other মই এবং strcmp ব্যবহার অনিবার্য।

ডেমো

এবং স্ট্রিংগুলির জন্য স্যুইচ-কেস অনুকরণ করার জন্য এখানে সহজ ম্যাক্রোগুলি রয়েছে।

এবং আপনি তাদের হিসাবে ব্যবহার করতে পারেন

আউটপুট:

নীচে নেস্টেড সুইচ ব্যবহার:

আউটপুট:

এখানে বিপরীত স্ট্রিং সুইচ, যেখানে আপনি CASE শৃঙ্খলে একটি পরিবর্তনশীল (ধ্রুবকের চেয়ে) ব্যবহার করতে পারেন:

আউটপুট:


"এমনকি নিয়মিত স্যুইচ-কেসটি অভ্যন্তরীণভাবে যদি অন্য কোনও মই (পূর্ণসংখ্যার জন্য) হয়" এটি সত্য নয়। যদি সম্ভব হয় তবে সংকলকটি একটি জাম্প টেবিল তৈরি করবে, যা আরও কার্যকর হবে। স্ট্যাকওভারফ্লো.com
দাদা

2

এটি আমি সাধারণত এটি করি।


মজাদার. অভাব (সম্ভবত পছন্দ অনুসারে) রক্ষণাত্মক কোডিং। এবং ক্ষেত্রে অতিরিক্ত ধনুর্বন্ধনী প্রশংসা করি। কোডটিকে আরও বেশি পঠনযোগ্য করে তোলে (যদিও আমি মামলার ক্ষেত্রে ইপ্পিশিয়ান ব্রেসগুলি পছন্দ করি)।
দারিউজ

4
বিটিডাব্লু, আপনি ক্ষেত্রে লেবেলগুলিতে ধ্রুবক অভিব্যক্তি ব্যবহার করতে পারেন। case 'B'<<8+'1':আমি মনে করি 0x4231 এর চেয়ে এই পরিষ্কার করা হবে।
জেনস

আমি একটি ম্যাক্রো ব্যবহার করব। #define twochar(a) (((uint16_t)a[1]<<8)|a[0])
v7d8dpo4

1

এইভাবে আপনি এটি করেন। না সত্যিই না.


4
আমি এটি স্ট্যান্ডার্ড সি বলে মনে করি না
জোহান কোটলিনস্কি

4
ম্যাক্রো সমর্থন মিশ্র প্রান্তিকতা তৈরি করা, বা কোনও ফাংশন পাঠকের জন্য অনুশীলন হিসাবে রেখে দেওয়া হয়েছে।

4
এটি স্ট্যান্ডার্ড সি, তবে পোর্টেবল নয়। মাল্টি-বাইট চরের বাইট ক্রম হ'ল 'বাস্তবায়ন নির্ভর' এবং মেশিন বাইট ক্রম প্রতিফলিত করার প্রয়োজন নেই। আমি এটি একবার ব্যবহার করেছি এবং পুড়ে গিয়েছি: সোলারিস স্পার্কে (বড় এন্ডিয়ান) জিএনইউ-সি 3.4 সানস্টুডিও 12 এর চেয়ে আলাদা একটি বাইট অর্ডার ব্যবহার করেছে
প্যাট্রিক

@ ত্রিস্টোপিয়া আপনি অবশ্যই ঠিক আছেন (বাস্তবের জন্য এটির মতো কিছু করার চেষ্টা করার পরে যেমন সঠিক হতে পারে)। এজন্য আমাদের পরিবর্তে সকলের বি ব্যবহার করা উচিত।

কেন আপনি আপনার অ্যাকাউন্ট মেরেছেন?

1

যদি এটি 2 বাইট স্ট্রিং হয় তবে আপনি এই কংক্রিটের উদাহরণের মতো কিছু করতে পারেন যেখানে আমি ISO639-2 ভাষা কোডগুলিতে স্যুইচ করি।

LANIDX_ * অ্যারে ইনডেক্স করার জন্য ধ্রুবক পূর্ণসংখ্যা হিসাবে ব্যবহৃত হয়।


0

অল্প পরিসীমা এবং আকারের (চারার) == 1 ধরে নেওয়া, আপনি এটি করতে পারেন (এরকম কিছু মাইক্রোমের পরামর্শ দিয়েছিল)।

এটি বিই ক্ষেত্রে সাধারণীকরণ করা যেতে পারে।


4
না যে! এটি "ডেটা অ্যালাইনমেন্ট" ব্যতিক্রমের কারণ হতে পারে। এটির কোনও গ্যারান্টি নেই যে চর * টেক্সট কোনও ঠিকানায় ইঙ্গিত করে যা আন্তঃর সারিবদ্ধকরণের প্রয়োজনীয়তার সাথে মেলে।
হার্পার

@ আর তিনি এটি চেয়েছিলেন। @ হার্পার এটি x86 এর ক্ষেত্রে নয়।
ruslik

নিক্লাস x86 এর জন্য জিজ্ঞাসা করেনি। এবং যেহেতু আপনি বড় এন্ডিয়ান কেসটি উল্লেখ করেছেন তাই আপনি x86 পরিবেশটিকে একচেটিয়াভাবে সম্বোধন করবেন না। যাতে '
হার্পার

তদুপরি, মাল্টি বাইট অক্ষর মেশিন বাইট ক্রমে neserserly হয় না। আমার মন্তব্য jbcreix উত্তর দেখুন।
প্যাট্রিক Schlüter

0

ফাংশন পয়েন্টারগুলি এটি করার একটি দুর্দান্ত উপায়, যেমন

result = switchFunction(someStringKey); //result is an optional return value

... এটি স্ট্রিং কী দ্বারা সেট করা একটি ফাংশনকে কল করে (প্রতি ক্ষেত্রে একটি ফাংশন):

প্রাক-বিদ্যমান হ্যাশম্যাপ / টেবিল / অভিধান প্রয়োগ যেমন খাশ, সেই পয়েন্টারটির অভ্যন্তরের কোনও ফাংশনে ফিরিয়ে দিন switchFunction()এবং এটি সম্পাদন করুন (বা কেবল এটি থেকে ফিরে switchFunction()আসুন এবং এটি নিজে চালনা করুন)। মানচিত্রের প্রয়োগটি যদি এটি সংরক্ষণ না করে তবে কেবলমাত্র uint64_tপরিবর্তে একটি পয়েন্টারের পরিবর্তে আপনি একটি কাস্টম ব্যবহার করুন ।


@ এরি0o আপনি যদি মনে করেন এটি শালীন, তবে কেন এটি উত্সাহিত করবেন না? আসল ডাউনভোটার দীর্ঘ চলে গেছে।
প্রকৌশলী

-2

হাই আপনার এই ক্ষেত্রেটি থাকলে এটি সহজ এবং দ্রুত উপায়:

[দ্রুত মোড]

[বর্ণিত মোড]

উদাহরণস্বরূপ: আমার অনেক মেনু রয়েছে, প্রথম মেনুতে প্রতিটি পছন্দ আপনাকে ২ য় মেনুতে নিয়ে যায়, ২ য় মেনু এবং ২ য় মেনুতে একই জিনিস b তবে বিকল্পগুলি ডিফেরেন্ট যাতে আপনি জানেন যে ব্যবহারকারীটি ফিনালিকে বেছে নিয়েছে। উদাহরণ:

মেনু 1: 1 ==> মেনু 2: 4 ==> মেনু 3: 2 (...) পছন্দটি 142. অন্যান্য ক্ষেত্রে: 111,141,131,122 ...

সলিউশন: এ-তে প্রথম 1 ম, খ-এ 2 য়, সি তে তৃতীয় স্টোর। a = 1, খ = 4, সি = 2

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.