আমি কীভাবে সি তে একটি অ্যারে তৈরি করব?


263

আমি সি তে স্ট্রিংগুলির একটি অ্যারে তৈরি করার চেষ্টা করছি যদি আমি এই কোডটি ব্যবহার করি:

char (*a[2])[14];
a[0]="blah";
a[1]="hmm";

জিসিসি আমাকে "সতর্কতা দেয়: বেমানান পয়েন্টার টাইপ থেকে অ্যাসাইনমেন্ট"। এটি করার সঠিক উপায় কী?

সম্পাদনা: আমি কৌতূহল যে কেন এটি একটি সংকলক সতর্কতা দেবে কারণ আমি যদি এটি করি তবে printf(a[1]);এটি সঠিকভাবে "এইচএমএম" প্রিন্ট করে।

c  arrays  string 

12
কেবল রেকর্ডের জন্য, char (*a[2])[14]14 টি অক্ষরের অ্যারেতে দুটি পয়েন্টারের একটি অ্যারে।
অবাকর

4
আমি ভেবেছিলাম এটি দুটি চর XD এর অ্যারে চৌদ্দ পয়েন্টার ছিল
6'09

74
সি প্রকারের ডিসিফেরিংয়ের জন্য আমি সবচেয়ে দরকারী পরামর্শটি পড়েছিলাম: "নামটি শুরু করুন, আপনি যখন পারেন ঠিক তখনই পড়ুন, যখন আপনাকে অবশ্যই": char (*a[2])[14]- শুরু করুন a, ডানদিকে সরান: "দু'এর অ্যারে", বাম দিকে সরান: ব্র্যাকেট সম্পূর্ণ তাই ডান পড়ুন: "ফরটিনের অ্যারে", বামে পড়ুন: "চার" ... এটি একসাথে রাখুন এবং আমাদের কাছে "একটি চৌদ্দটি অক্ষরের দুটি পয়েন্টারের অ্যারে" রয়েছে
মার্ক কে কোয়ান

4
@ ডটানকোহেন: এই পরামর্শটি শেষ পর্যন্ত আমাকে পয়েন্টারগুলি লেখার char *strচেয়ে বরং লেখার জন্য রাজি করিয়েছে char* str। একটি ডেল্ফি / পাস্কাল ব্যাকগ্রাউন্ড থেকে আগত, আমি আরও জটিল ধরণের না আসা পর্যন্ত আমি পরের দিকে খুব অভ্যস্ত ছিলাম। পূর্বের উপায়টি এখনও আমার কাছে কুৎসিত লাগে, তবে প্রকারের স্বরলিপিটিকে আরও সুসংগত করে তোলে (আইএমও)।
কে কে কোয়ান

@ মারককোয়ান, আশ্চর্যজনক! ধন্যবাদ! :)
ডাঃ এসেন

উত্তর:


232

আপনি যদি স্ট্রিংগুলি পরিবর্তন করতে না চান তবে আপনি কেবল তা করতে পারেন

const char *a[2];
a[0] = "blah";
a[1] = "hmm";

আপনি যখন এটি এটি করেন আপনি দুটি পয়েন্টারের একটি অ্যারে বরাদ্দ করবেন const char। এই পয়েন্টারগুলি স্থির স্ট্রিংগুলির ঠিকানাগুলিতে সেট করা হবে "blah"এবং "hmm"

আপনি যদি সত্যিকারের স্ট্রিং সামগ্রী পরিবর্তন করতে সক্ষম হতে চান তবে আপনার মতো কিছু করতে হবে

char a[2][14];
strcpy(a[0], "blah");
strcpy(a[1], "hmm");

এটি charপ্রতিটি 14 টির জন্য পরপর দুটি অ্যারে বরাদ্দ করবে , তার পরে স্থির স্ট্রিংয়ের বিষয়বস্তু তাদের মধ্যে অনুলিপি করা হবে।


185

সি তে স্ট্রিংগুলির অ্যারে তৈরি করার বিভিন্ন উপায় রয়েছে যদি সমস্ত স্ট্রিং একই দৈর্ঘ্য হতে চলেছে (বা কমপক্ষে একই সর্বোচ্চ দৈর্ঘ্য থাকতে পারে), আপনি খালি একটি 2-ডি অ্যারে ঘোষণা করুন এবং প্রয়োজনীয় হিসাবে নির্ধারণ করুন:

char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1];
...
strcpy(strs[0], aString); // where aString is either an array or pointer to char
strcpy(strs[1], "foo");

আপনি পাশাপাশি প্রাথমিকের একটি তালিকা যুক্ত করতে পারেন:

char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1] = {"foo", "bar", "bletch", ...};

এটি আপনার অ্যারের মাত্রাগুলির সাথে মিলিয়ে ইনিশিয়ালাইজারের স্ট্রিংয়ের আকার এবং সংখ্যা ধরে নেয়। এই ক্ষেত্রে, প্রতিটি স্ট্রিং আক্ষরিক (যা নিজেই চরের শূন্য-সমাপ্ত অ্যারে) এর সামগ্রীগুলি স্ট্রান্সকে বরাদ্দ করা মেমোরিতে অনুলিপি করা হয়। এই পদ্ধতির সাথে সমস্যাটি হ'ল অভ্যন্তরীণ খণ্ডিত হওয়ার সম্ভাবনা; আপনার যদি 5 টি অক্ষর বা তার চেয়ে কম 99 টি স্ট্রিং থাকে তবে 1 টি স্ট্রিং যা 20 টি অক্ষর দীর্ঘ, 99 স্ট্রিংগুলিতে কমপক্ষে 15 অব্যবহৃত অক্ষর থাকবে; এটা জায়গা অপচয়।

চরের 2-ডি অ্যারে ব্যবহারের পরিবর্তে, আপনি চরে পয়েন্টারগুলির 1-d অ্যারে সঞ্চয় করতে পারেন:

char *strs[NUMBER_OF_STRINGS];

মনে রাখবেন যে এই ক্ষেত্রে, আপনি কেবল স্ট্রিংগুলিতে পয়েন্টার ধরে রাখতে মেমরি বরাদ্দ করেছেন; স্ট্রিংগুলির জন্য স্মৃতিটি অন্যত্র বরাদ্দ করতে হবে (হয় স্ট্যাটিক অ্যারে হিসাবে বা ব্যবহারের মাধ্যমে malloc()বা calloc())। আপনি পূর্বের উদাহরণের মতো ইনিশিয়ালাইজার তালিকাটি ব্যবহার করতে পারেন:

char *strs[NUMBER_OF_STRINGS] = {"foo", "bar", "bletch", ...};

স্ট্রিং ধ্রুবকগুলির বিষয়বস্তু অনুলিপি করার পরিবর্তে আপনি কেবল তাদের পয়েন্টারগুলি স্টোর করছেন। নোট করুন যে স্ট্রিং ধ্রুবকগুলি লিখিত হতে পারে না; আপনি পয়েন্টারটিকে পুনরায় নিয়োগ করতে পারেন, যেমন:

strs[i] = "bar";
strs[i] = "foo"; 

তবে আপনি স্ট্রিংয়ের বিষয়বস্তু পরিবর্তন করতে পারবেন না; অর্থাত,

strs[i] = "bar";
strcpy(strs[i], "foo");

অনুমোদিত হতে পারে না।

আপনি malloc()প্রতিটি স্ট্রিংয়ের জন্য বাফারকে গতিশীলভাবে বরাদ্দ করতে এবং সেই বাফারে অনুলিপি করতে পারেন:

strs[i] = malloc(strlen("foo") + 1);
strcpy(strs[i], "foo");

BTW,

char (*a[2])[14];

চরের 14-উপাদান অ্যারেগুলিকে পয়েন্টারগুলির 2-উপাদান অ্যারে হিসাবে ঘোষণা করে।


3
@ স্লেটার: হ্যাঁ, যদি এটি কোনও mallocকল ফলাফল ।
জন বোদে

এই খুব বিস্তারিত উত্তরের জন্য আপনাকে ধন্যবাদ। এটি সত্যিই আমাকে সাহায্য করেছিল।
23:15 '

1
কেন আমরা কেবল স্ট্রিং অ্যারেগুলিতে 2 ডি অ্যারে হিসাবে ঘোষিত স্ট্রিংপি ব্যবহার করতে পারি। স্ট্যান্ডার্ড অ্যাসাইনমেন্ট কেন ব্যর্থ হয়?
অ্যান্ড্রু এস

4
@ অ্যান্ড্রুস: সম্পূর্ণ উত্তর কোনও মন্তব্যে মাপসই হবে না, তবে মূলত এটি সি কী অ্যারে এক্সপ্রেশনকে আচরণ করে তার একটি শৈল্পিক বিষয়; বেশিরভাগ পরিস্থিতিতে, টাইপের একটি এক্সপ্রেশনটি টাইপের একটি অভিব্যক্তিতে T [N]রূপান্তরিত হয় এবং এক্সপ্রেশনটির T *মান হ'ল প্রথম উপাদানটির ঠিকানা। সুতরাং আপনি যদি লিখে থাকেন তবে আপনি অ্যারের সাথে str = "foo"প্রথম চরিত্রের ঠিকানা নির্ধারণ করার চেষ্টা করবেন যা কাজ করে না। আরও তথ্যের জন্য এই উত্তর দেখুন । "foo"str
জন বোড

@ জোহনবোড আপনি কি দয়া করে ছোট্ট টুইটটি যুক্ত করতে পারেন? char *strs[NUMBER_OF_STRINGS] = {0}; এটি শুরু করে ভবিষ্যতের সমস্যা প্রতিরোধে সহায়তা strsকরে NULL। যখন গুগল সি
c

94

স্বীকারোক্তি করুন! ধ্রুব স্ট্রিং:

const char *strings[] = {"one","two","three"};

যদি অামি যথাযথভাবে স্মরণ করি.

ওহ, এবং অ্যাসাইনমেন্টের জন্য আপনি strcpy ব্যবহার করতে চান , = অপারেটর নয়। আরআরসিপিপি_এস নিরাপদ তবে এটি সি ৮৮ এ বা সি 99 স্ট্যান্ডার্ডে নয়।

char arr[MAX_NUMBER_STRINGS][MAX_STRING_SIZE]; 
strcpy(arr[0], "blah");

হালনাগাদ: থমাস বলেছেন strlcpyপথ যেতে হবে।


এটা কি C99? আমি বিশ্বাস করি না এটি এএনএসআই সি তে সম্ভব
নলডোরিন

6
এটি C89 এবং C99 উভয়ই সম্ভব। এটি কনস্টের সাথে বা এটি ছাড়াও গুরুত্বপূর্ণ নয়, যদিও প্রাক্তনটি পছন্দ হয়।
অবাকর

1
ঠিক আছে, কনস্টটি নতুন, এবং আপনাকে বাইরের অ্যারের আকার নির্দিষ্ট করতে হবে (এই ক্ষেত্রে 3), তবে অন্যথায় এটি পুরোপুরি গ্রহণযোগ্য কেএন্ডআর সি আছে আমার কাছে একটি পুরানো সি বইয়ের কপিরাইটযুক্ত 1984 আছে যাতে একটি বিভাগ রয়েছে যা দেখায় যে এটা কর. তারা এটিকে একটি "রাগযুক্ত অ্যারে" বলে। অবশ্যই এর কোনও "অপারেটর" ছিল না, এবং strcpy_s আমার কাছে নতুন।
টেড

6
strcpy_s একটি মাইক্রোসফ্ট ফাংশন। এটি সম্ভবত এড়ানো উচিত কারণ এটি স্ট্যান্ডার্ড সি
তে নেই

5
strcpy_s এবং অন্যান্য "নিরাপদ ফাংশনগুলি" আইএসও / আইইসি টিআর 24731 হিসাবে মানক করা হয়েছে (এটি একটি আইএসও প্রকাশিত স্ট্যান্ডার্ড এবং এটি অনলাইনে বিনামূল্যে উপলভ্য নয়; সর্বাধিক সাম্প্রতিক খসড়াটি ওপেন-std.org/jtc1/sc22/wg14/www /docs/n1225.pdf )
পাভেল মিনায়েভ

14

এখানে আপনার কয়েকটি বিকল্প রয়েছে:

char a1[][14] = { "blah", "hmm" };
char* a2[] = { "blah", "hmm" };
char (*a3[])[] = { &"blah", &"hmm" };  // only since you brought up the syntax -

printf(a1[0]); // prints blah
printf(a2[0]); // prints blah
printf(*a3[0]); // prints blah

এর সুবিধাটি a2হ'ল আপনি তারপরে স্ট্রিং লিটারেলগুলি সহ নিম্নলিখিতটি করতে পারেন

a2[0] = "hmm";
a2[1] = "blah";

এবং a3আপনার জন্য নিম্নলিখিতগুলি করতে পারে:

a3[0] = &"hmm";
a3[1] = &"blah";

জন্য a1আপনি ব্যবহার করতে হবে strcpy()(এখনো ভাল strncpy()) এমনকি যখন স্ট্রিং লিটারেল বরাদ্দ। কারণটি হ'ল a2এবং a3এটি পয়েন্টারের অ্যারে এবং আপনি তাদের উপাদানগুলি (অর্থাত্ পয়েন্টারগুলি) যেকোন স্টোরেজকে পয়েন্ট করতে পারেন, যেখানে a1'অক্ষরের অ্যারে' এর অ্যারে রয়েছে এবং সুতরাং প্রতিটি উপাদান একটি অ্যারে যা তার নিজস্ব স্টোরেজকে "মালিকানাধীন" করে ( যার অর্থ এটি যখন সুযোগের বাইরে চলে যায় তখন এটি ধ্বংস হয়ে যায়) - আপনি কেবল স্টোরেজে স্টাফ অনুলিপি করতে পারবেন।

এটি আমাদের ব্যবহারের অসুবিধায়ও নিয়ে আসে a2এবং a3- যেহেতু তারা স্ট্যাটিক স্টোরেজকে নির্দেশ করে (যেখানে স্ট্রিং লিটারালগুলি সংরক্ষণ করা হয়) যার বিষয়বস্তু নির্ভরযোগ্যভাবে পরিবর্তন করা যায় না (যেমন, অপরিজ্ঞাত আচরণ), যদি আপনি নন-স্ট্রিং লিটারেলগুলি অ্যাসাইন করতে চান তবে a2বা a3- এর উপাদানগুলি আপনাকে প্রথমে গতিশীলভাবে পর্যাপ্ত পরিমাণ মেমরি বরাদ্দ করতে হবে এবং তারপরে তাদের উপাদানগুলি এই স্মৃতিতে নির্দেশ করবে এবং তারপরে অক্ষরগুলি অনুলিপি করতে হবে - এবং তারপরে আপনার অবশ্যই স্মৃতিটিকে ডিলেট করতে হবে নিশ্চিত হওয়া উচিত done

বাহ - আমি ইতিমধ্যে সি ++ মিস করছি;)

PS আপনার উদাহরণের প্রয়োজন হলে আমাকে জানান।


আমারে আরডুইনো প্রকল্পের জন্য স্ট্রিং অ্যারে দরকার। শেষে আমি এ 2 স্টাইলটি ব্যবহার করেছি। আমি প্রথমে আমার স্ট্রিং অ্যারেটিকে চর এ 1 হিসাবে সংজ্ঞায়িত করতে এ 1 শৈলীটি চেষ্টা করেছি [] [2] = F "এফ 3", "জি 3" ... ইত্যাদি। 2 যেহেতু এটি 2-অক্ষরের দীর্ঘ স্ট্রিংগুলি সঞ্চয় করার উদ্দেশ্যে ছিল। এটি অপ্রত্যাশিত আউটপুট দিয়েছে কারণ আমি নাল-টার্মিনেটর ভুলে গেছি তার অর্থ প্রতিটি অক্ষরের 2 টি অক্ষর সংরক্ষণ করার জন্য কমপক্ষে 3 এর আকার হওয়া উচিত। এ 2 স্টাইলটি ব্যবহার করে, আমার স্ট্রিংয়ের দৈর্ঘ্য নির্দিষ্ট করার দরকার নেই, এবং এটি বিভিন্ন স্ট্রিং দৈর্ঘ্যের পাশাপাশি সামঞ্জস্য করতে পারে তাই আমি স্থির করে নেওয়ার সিদ্ধান্ত নিয়েছি :-)
জেরোমি অ্যাডোফো

চর (* a3 []) [] = {& "ব্লাহ", & "এইচএমএম"}; => জি ++ অ্যাপল এলএলভিএম সংস্করণ 9.1.0 এ কাজ করে না তবে এটি জিসিসিতে কাজ করে
1234

12

অথবা আপনি কোনও কাঠামোর প্রকার ঘোষণা করতে পারেন, এতে একটি অক্ষর অ্যারি (1 স্ট্রিং) রয়েছে, তারা স্ট্রাক্টগুলির একটি অ্যারে তৈরি করে এবং এইভাবে একটি বহু-উপাদান অ্যারে তৈরি করে

typedef struct name
{
   char name[100]; // 100 character array
}name;

main()
{
   name yourString[10]; // 10 strings
   printf("Enter something\n:);
   scanf("%s",yourString[0].name);
   scanf("%s",yourString[1].name);
   // maybe put a for loop and a few print ststements to simplify code
   // this is just for example 
 }

অন্য যে কোনও পদ্ধতিতে এর অন্যতম সুবিধা হ'ল এটি আপনাকে ব্যবহার না করেই স্ট্রিংয়ে সরাসরি স্ক্যান করতে দেয় strcpy;


10

এএনএসআই সি তে:

char* strings[3];
strings[0] = "foo";
strings[1] = "bar";
strings[2] = "baz";

8
@ জিফ্রে: আমি সম্পূর্ণ একমত নই এটি অত্যন্ত প্রকারের অংশ - এই ক্ষেত্রে একটি "চর পয়েন্টার"। আপনি যাইহোক কী বলবেন ... এটি ভেরিয়েবল নামের অংশ? আমি অনেকগুলি সক্ষম প্রোগ্রামার এই স্টাইলটি ব্যবহার করতে দেখেছি।
নলডোরিন

14
অন্য কারও এটি পড়ার জন্য, আমি এটি উল্লেখ করতে চাই যে বর্জন স্ট্রস্ট্রপ * * টাইপ করে রাখে ...
মিররফেটে

1
নিবন্ধন করুন আসলে, এটি আমার জানা থেকে সি ++ এ অনুশীলন করার প্রস্তাব দেওয়া হচ্ছে। শব্দার্থগতভাবে এটি ব্যবহারকারীর কারণে এটি সনাক্তকারী দ্বারা এটি রাখা আমার কোনও অর্থবোধ করে না। : /
নলডোরিন

16
@ নলডোরিন char* foo, bar;কি ধরণের bar?
মাউসউড

10
সি ডেনিস রিচি ১৯ 197২ সালে বিকাশ করেছিলেন এবং ১৯৮৮ সালে তিনি এবং ব্রায়ান কর্নিগান কে অ্যান্ডআর - দ্য সি প্রোগ্রামিং ল্যাঙ্গুয়েজ-এর দ্বিতীয় সংস্করণ প্রকাশ করেছিলেন, এটি একটি বই সি-র মানদণ্ডের মান হিসাবে চিহ্নিত করেছে।
মারিয়াস লিয়ান

10

যদি স্ট্রিংগুলি স্থির থাকে তবে আপনি এগুলি দিয়ে সেরা:

const char *my_array[] = {"eenie","meenie","miney"};

বেসিক এএনএসআই সি-র অংশ না থাকলেও আপনার পরিবেশ সিনট্যাক্সকে সমর্থন করে। এই স্ট্রিংগুলি অপরিবর্তনীয় (কেবলমাত্র পঠনযোগ্য) এবং তাই অনেক পরিবেশে একটি স্ট্রিং অ্যারে গতিশীলভাবে তৈরি করার চেয়ে কম ওভারহেড ব্যবহার করে।

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


10

আপনি যদি অ্যারে সংখ্যক স্ট্রিংয়ের ট্র্যাক রাখতে না চান এবং সেগুলির উপরে পুনরাবৃত্তি করতে চান, তবে শেষ পর্যন্ত কেবল নুল স্ট্রিং যুক্ত করুন:

char *strings[]={ "one", "two", "three", NULL };

int i=0;
while(strings[i]) {
  printf("%s\n", strings[i]);
  //do something
  i++;
};

আমি বিশ্বাস করি এটি কেবল সি ++ এ বৈধ। সি-তে, NULL শূন্য হওয়ার গ্যারান্টিযুক্ত নয়, সুতরাং লুপটি যখন ভাঙা উচিত তখন তা ভাঙ্গতে পারে না। আমি ভুল হলে আমাকে সংশোধন করুন।
প্যালেক

2
ধারণা নেই :) আপনি যদি পছন্দ করেন তবে আপনি বিবৃতিতে তুলনা করতে পারেন।
সের্গেই

9

স্ট্রিং আক্ষরিক const char *গুলি হয়।

এবং আপনার প্রথম বন্ধনী ব্যবহার অদ্ভুত। আপনি সম্ভবত বলতে চাইছেন

const char *a[2] = {"blah", "hmm"};

যা ধ্রুবক অক্ষরগুলিতে দুটি পয়েন্টারের একটি অ্যারে ঘোষণা করে এবং দুটি হার্ডকোডযুক্ত স্ট্রিং ধ্রুবকগুলিতে নির্দেশ করতে তাদের সূচনা করে।


3

আপনার কোডটি ফাংশন পয়েন্টারগুলির একটি অ্যারে তৈরি করছে। চেষ্টা

char* a[size];

অথবা

char a[size1][size2];

পরিবর্তে.

অ্যারে এবং পয়েন্টারগুলিতে উইকিবুকগুলি দেখুন


1
আপনার ভিন্ন পদ্ধতির জন্য টুপিগুলি ... আপনার মতো লোকেরা উপচে
সাহু ভি কুমার

1

হ্যালো আপনি এই বেলো চেষ্টা করতে পারেন:

 char arr[nb_of_string][max_string_length]; 
 strcpy(arr[0], "word");

আপনি চাইলে স্ট্রিংগুলির অ্যারে ব্যবহারের একটি দুর্দান্ত উদাহরণ

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


int main(int argc, char *argv[]){

int i, j, k;

// to set you array
//const arr[nb_of_string][max_string_length]
char array[3][100];

char temp[100];
char word[100];

for (i = 0; i < 3; i++){
    printf("type word %d : ",i+1);
    scanf("%s", word);
    strcpy(array[i], word);
}

for (k=0; k<3-1; k++){
    for (i=0; i<3-1; i++)
    {
        for (j=0; j<strlen(array[i]); j++)
        {
            // if a letter ascii code is bigger we swap values
            if (array[i][j] > array[i+1][j])
            {
                strcpy(temp, array[i+1]);
                strcpy(array[i+1], array[i]);
                strcpy(array[i], temp);

                j = 999;
            }

            // if a letter ascii code is smaller we stop
            if (array[i][j] < array[i+1][j])
            {
                    j = 999;
            }

        }
    }
}

for (i=0; i<3; i++)
{
    printf("%s\n",array[i]);
}

return 0;
}

0
char name[10][10]
int i,j,n;//here "n" is number of enteries
printf("\nEnter size of array = ");
scanf("%d",&n);
for(i=0;i<n;i++)
{
    for(j=0;j<1;j++)
    {
        printf("\nEnter name = ");
        scanf("%s",&name[i]);
    }
}
//printing the data
for(i=0;i<n;i++)
{
    for(j=0;j<1;j++)
    {
        printf("%d\t|\t%s\t|\t%s",rollno[i][j],name[i],sex[i]);
    }
    printf("\n");
}

এখানে এই চেষ্টা !!!


1
আপনি ব্যাখ্যা করতে পারেন কেন আপনার জন্য ভেরিয়েবল জে, যেমন (জে = 0; জে <1; জে ++) এর জন্য লুপের প্রয়োজন?
সৌভিকমাজি

0

আমি স্ট্রিংগুলির আরও গতিশীল অ্যারে অনুপস্থিত ছিলাম, যেখানে রান-টাইম নির্বাচনের উপর নির্ভর করে স্ট্রিংগুলির পরিমাণ বিভিন্ন রকম হতে পারে, তবে অন্যথায় স্ট্রিংগুলি ঠিক করা উচিত।

আমি কোডিং স্নিপেটের এভাবে শেষ করেছি:

#define INIT_STRING_ARRAY(...)          \
    {                                   \
        char* args[] = __VA_ARGS__;     \
        ev = args;                      \
        count = _countof(args);         \
    }

void InitEnumIfAny(String& key, CMFCPropertyGridProperty* item)
{
    USES_CONVERSION;
    char** ev = nullptr;
    int count = 0;

    if( key.Compare("horizontal_alignment") )
        INIT_STRING_ARRAY( { "top", "bottom" } )

    if (key.Compare("boolean"))
        INIT_STRING_ARRAY( { "yes", "no" } )

    if( ev == nullptr )
        return;

    for( int i = 0; i < count; i++)
        item->AddOption(A2T(ev[i]));

    item->AllowEdit(FALSE);
}

char** evঅ্যারে স্ট্রিংগুলিতে পয়েন্টার তুলে এবং _countofফাংশন ব্যবহার করে স্ট্রিংগুলির পরিমাণ গণনা করে । (অনুরূপ sizeof(arr) / sizeof(arr[0]))

এবং A2Tম্যাক্রো ব্যবহার করে ইউনিকোড রূপান্তর করতে অতিরিক্ত আনসি রয়েছে তবে এটি আপনার ক্ষেত্রে optionচ্ছিক হতে পারে।


-6

একটি ভাল উপায় একটি স্ট্রিং আপনার নিজের সংজ্ঞা দেওয়া হয়।

#include <stdio.h>
typedef char string[]
int main() {
    string test = "string";
    return 0;
}

এটা সত্যিই সহজ।


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