সি চর অ্যারের সূচনা


119

নিম্নলিখিত পদ্ধতিতে সূচনা করার পরে চর অ্যারেতে কী থাকবে তা আমি নিশ্চিত নই।

1. char buf[10] = "";
2. char buf[10] = " ";
3।char buf[10] = "a";

কেস 2 জন্য, আমি মনে করি buf[0]হওয়া উচিত ' ', buf[1]হওয়া উচিত '\0', এবং থেকে buf[2]থেকে buf[9]র্যান্ডম সন্তুষ্টি লাভ করবে। কেস 3, আমি মনে করি buf[0]হওয়া উচিত 'a', buf[1]হওয়া উচিত '\ 0', এবং থেকে buf[2]থেকে buf[9]র্যান্ডম সন্তুষ্টি লাভ করবে।

এটা কি ঠিক?

এবং কেস 1 এর জন্য, কী হবে buf? buf[0] == '\0'এবং থেকে buf[1]থেকে buf[9]র্যান্ডম বিষয়বস্তু হবে?


2
ঠিক আছে, আমার সংকলকটি আপনার (সংশোধিত) কোডটি গ্রহণ করে না: "অ্যারে টাইপ 'চর [10]' বরাদ্দযোগ্য নয়"।
মার্টিন আর

@ মার্টিনআর এখন এটি কাজ করবে ...

1
@ এলককিমমোভিং: সংকলন char buf[10]; buf = "a";করে না । - দয়া করে প্রথমে এটি চেষ্টা করে দেখুন এবং তারপরে আপনার আসল কোডটি কপিরাইট / পেস্ট করুন । এটি আপনার এবং আপনার প্রশ্নের সমস্ত পাঠকের পক্ষে প্রচুর কাজ সাশ্রয় করে।
মার্টিন আর

@ মার্টিনআর এর জন্য দুঃখিত আমি ভেবেছিলাম আমি বুফকে [] পরে অর্পণ করতে পারি তবে এটি মনে হয় না। এখন কোড চালায়।
এল কেকিমুভিং

উত্তর:


222

আপনি অ্যারেটি কীভাবে এটি আরম্ভ করবেন তা নয়, তবে এর জন্য:

  1. প্রথম ঘোষণা:

    char buf[10] = "";

    সমতুল্য

    char buf[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  2. দ্বিতীয় ঘোষণা:

    char buf[10] = " ";

    সমতুল্য

    char buf[10] = {' ', 0, 0, 0, 0, 0, 0, 0, 0, 0};
  3. তৃতীয় ঘোষণা:

    char buf[10] = "a";

    সমতুল্য

    char buf[10] = {'a', 0, 0, 0, 0, 0, 0, 0, 0, 0};

আপনি দেখতে পাচ্ছেন, কোনও এলোমেলো সামগ্রী নেই: যদি কম ইনিশিয়ালাইজার থাকে তবে অ্যারের বাকী অংশটি আরম্ভ করা হয় 0। এই ক্ষেত্রে এমনকি যদি কোনও ফাংশনের অভ্যন্তরে অ্যারে ঘোষণা করা হয়।


46
প্রশ্ন জিজ্ঞাসা করা ব্যক্তির স্বার্থে, এটি উল্লেখ করা মূল্যবান যে সি স্ট্যান্ডার্ডের জন্য বাকি উপাদানগুলির জন্য শূন্যের সাথে প্যাড করা কোনও আংশিক-সম্পূর্ণ অ্যারে সূচনা প্রয়োজন (সংকলক দ্বারা)। এটি কেবল নয়, সমস্ত ডেটা ধরণের জন্য রয়েছে char
ধান

4
@ বাঃ বুফের শেষে '\ 0' নেই কেন?
lkkeepmoving

14
@ এলকিকিমমুভিং 0এবং '\0একই মান রয়েছে।
ohah

1
@ এলককিমমিং ইনিশিয়ালাইজেশন এবং অ্যাসাইনমেন্ট দুটি পৃথক জন্তু, সুতরাং সি আপনাকে চরের অ্যারের জন্য ইনিশিয়াল হিসাবে স্ট্রিং সরবরাহ করতে দেয় তবে অ্যারে অ্যাসাইনমেন্টগুলি নিষিদ্ধ করে (যেমন ওউয়া বলেছেন)।
লরেঞ্জো দোনাটি - কোডিডাক্ট ডটকম

3
@ পেসারিয়্যারটি char buff[3] = "abcdefghijkl";অবৈধ। char p3[5] = "String";এছাড়াও অবৈধ। char p[6] = "String";বৈধ এবং একই হিসাবে char p[6] = {'S', 't', 'r', 'i', 'n', 'g'};
ইউহ

28

সম্পাদনা করুন: ওপি (বা কোনও সম্পাদক) আমি এই উত্তরটি সরবরাহ করার পরে কিছুটা ক্ষেত্রে মৌলিক প্রশ্নের একক উদ্ধৃতিটি ডাবল উদ্ধৃতিতে নীরবে পরিবর্তন করেছি।

আপনার কোডের ফলে সংকলক ত্রুটি হবে। আপনার প্রথম কোড খণ্ড:

char buf[10] ; buf = ''

দ্বিগুণ অবৈধ। প্রথমত, সিতে, খালি বলে কোনও জিনিস নেই char। আপনি খালি স্ট্রিং নির্দিষ্ট করতে ডাবল কোট ব্যবহার করতে পারেন:

char* buf = ""; 

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

char buf = '\0';

ব্যাকস্ল্যাশ চরিত্র থেকে বিচ্ছিন্ন করা প্রয়োজন '0'

char buf = 0;

একই জিনিসটি সম্পাদন করে, তবে পূর্ববর্তীটি পড়ার পক্ষে বাচ্চাটি কম অস্পষ্ট, আমার মনে হয়।

দ্বিতীয়ত, অ্যারেগুলি সংজ্ঞায়িত করার পরে আপনি আরম্ভ করতে পারবেন না।

char buf[10];

অ্যারে ঘোষণা করে এবং সংজ্ঞায়িত করে। অ্যারে শনাক্তকারী bufএখন মেমরির একটি ঠিকানা, এবং আপনি যেখানে bufঅ্যাসাইনমেন্টের মাধ্যমে পয়েন্টগুলি পরিবর্তন করতে পারবেন না । সুতরাং

buf =     // anything on RHS

অবৈধ। আপনার দ্বিতীয় এবং তৃতীয় কোড টুকরা এই কারণে অবৈধ।

একটি অ্যারে শুরু করার জন্য, আপনাকে সংজ্ঞা দেওয়ার সময় এটি করতে হবে:

char buf [10] = ' ';

প্রথম চরটি স্থান '\040'এবং বাকী সত্তা NUL, অর্থাৎ, সহ আপনাকে একটি 10-অক্ষরের অ্যারে দেবে '\0'। যখন একটি অ্যারেটিকে একটি প্রাথমিক সূচক দিয়ে ঘোষণা করা হয় এবং সংজ্ঞায়িত করা হয়, তখন নির্দিষ্ট প্রাথমিক মানগুলির সাথে থাকা অ্যারের উপাদানগুলি (যদি থাকে তবে) স্বয়ংক্রিয়ভাবে প্যাড হয়ে যায় 0। কোনও "এলোমেলো সামগ্রী" থাকবে না।

আপনি যদি অ্যারে ঘোষণা করে এবং সংজ্ঞা দেন তবে নীচের মত এটি আরম্ভ করবেন না:

char buf [10];

সমস্ত উপাদানগুলিতে আপনার এলোমেলো সামগ্রী থাকবে।


"একটি অ্যারে শুরু করার জন্য, আপনাকে সংজ্ঞা দেওয়ার সময় এটি করতে হবে ..." এটি এবং নিম্নলিখিত লাইনটি গ্রহণযোগ্য উত্তরের চেয়ে আরও ভাল করে তোলে।
লরি স্টার্ন

26
  1. এগুলি সমতুল্য

    char buf[10] = "";
    char buf[10] = {0};
    char buf[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  2. এগুলি সমতুল্য

    char buf[10] = " ";
    char buf[10] = {' '};
    char buf[10] = {' ', 0, 0, 0, 0, 0, 0, 0, 0, 0};
  3. এগুলি সমতুল্য

    char buf[10] = "a";
    char buf[10] = {'a'};
    char buf[10] = {'a', 0, 0, 0, 0, 0, 0, 0, 0, 0};

8

সি 11 স্ট্যান্ডার্ড খসড়া n1570 6.7.9 প্রারম্ভিক অংশের প্রাসঙ্গিক অংশটি বলে:

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

এবং

21 যদি একটি ব্রেস-আবদ্ধ তালিকায় কম সংখ্যক প্রাথমিক বা অগ্রিমেট সদস্যের সদস্য থাকে, বা অ্যারেতে উপাদানগুলির চেয়ে পরিচিত আকারের অ্যারে আরম্ভ করার জন্য ব্যবহৃত একটি স্ট্রিং আক্ষরিকের কম অক্ষর, সমষ্টিটির বাকী অংশ স্থিতিশীল স্টোরেজ সময়কাল যে অবজেক্ট হিসাবে একই স্পষ্টভাবে আরম্ভ করা হবে

সুতরাং, ' space 0' সংযুক্ত করা হয়, যদি পর্যাপ্ত জায়গা থাকে এবং বাকী অক্ষরগুলি static char c;একটি ফাংশনের মধ্যে আরম্ভ করা হবে এমন মান দিয়ে শুরু করা হয়।

অবশেষে,

10 যদি কোনও অবজেক্টের স্বয়ংক্রিয় স্টোরেজ সময়কাল স্পষ্টভাবে শুরু না করা হয়, তবে এর মান অনির্দিষ্ট। স্থিতিশীল বা থ্রেড স্টোরেজ সময়কাল আছে এমন কোনও বস্তু যদি স্পষ্টভাবে আরম্ভ করা হয় না, তবে:

[-]

  • যদি এটি গাণিতিক ধরণের থাকে তবে এটি শূন্য (ধনাত্মক বা স্বাক্ষরযুক্ত) থেকে আরম্ভ করা হয়;

[-]

সুতরাং, charপাটিগণিত টাইপ হওয়ায় অ্যারের বাকী অংশটি শূন্যের সাথে আরম্ভ করার নিশ্চয়তা দেওয়া হয়।


3

আকর্ষণীয়ভাবে যথেষ্ট, প্রোগ্রামে যে কোনও সময় যে কোনও উপায়ে অ্যারেগুলি শুরু করা সম্ভব, যদি তারা কোনও structবা এর সদস্য হয় union

উদাহরণ প্রোগ্রাম:

#include <stdio.h>

struct ccont
{
  char array[32];
};

struct icont
{
  int array[32];
};

int main()
{
  int  cnt;
  char carray[32] = { 'A', 66, 6*11+1 };    // 'A', 'B', 'C', '\0', '\0', ...
  int  iarray[32] = { 67, 42, 25 };

  struct ccont cc = { 0 };
  struct icont ic = { 0 };

  /*  these don't work
  carray = { [0]=1 };           // expected expression before '{' token
  carray = { [0 ... 31]=1 };    // (likewise)
  carray = (char[32]){ [0]=3 }; // incompatible types when assigning to type 'char[32]' from type 'char *'
  iarray = (int[32]){ 1 };      // (likewise, but s/char/int/g)
  */

  // but these perfectly work...
  cc = (struct ccont){ .array='a' };        // 'a', '\0', '\0', '\0', ...
  // the following is a gcc extension, 
  cc = (struct ccont){ .array={ [0 ... 2]='a' } };  // 'a', 'a', 'a', '\0', '\0', ...
  ic = (struct icont){ .array={ 42,67 } };      // 42, 67, 0, 0, 0, ...
  // index ranges can overlap, the latter override the former
  // (no compiler warning with -Wall -Wextra)
  ic = (struct icont){ .array={ [0 ... 1]=42, [1 ... 2]=67 } }; // 42, 67, 67, 0, 0, ...

  for (cnt=0; cnt<5; cnt++)
    printf("%2d %c %2d %c\n",iarray[cnt], carray[cnt],ic.array[cnt],cc.array[cnt]);

  return 0;
}

1

আমি নিশ্চিত নই তবে আমি সাধারণত একটি অ্যারে প্রাথমিকভাবে শুরু করি "সেক্ষেত্রে আমার স্ট্রিংয়ের নাল প্রান্ত সম্পর্কে উদ্বেগের দরকার নেই।

main() {
    void something(char[]);
    char s[100] = "";

    something(s);
    printf("%s", s);
}

void something(char s[]) {
    // ... do something, pass the output to s
    // no need to add s[i] = '\0'; because all unused slot is already set to '\0'
}

অন্তর্নিহিত ইনট বিধিটি ব্যবহার করা উচিত নয় । আপনার জন্য একটি প্রকার নির্দিষ্ট main()করতে হবে (এবং আপনার ব্যবহারও করা উচিত void, যেমন, int main(void) { ... }C99 এই নিয়মটি থেকে মুক্তি পেয়েছে, সুতরাং এই কোডটি C99 এবং তার পরে সংকলন করবে না here এখানে অন্যান্য বিষয় লক্ষণীয় বিষয়টি হ'ল আপনি যদি বাদ না পড়ে তবে C99 দিয়ে শুরু করুনreturn প্রধান, return 0;মূলটির }শেষের আগে একটি স্বয়ংক্রিয়ভাবে স্থাপন / নিহিত রয়েছে imp আপনি অন্তর্নিহিত ইনট বিধিটি ব্যবহার করছেন যা কেবল সি 99 এর আগে কাজ করে, তবুও আপনি এমন অন্তর্নিহিত ব্যবহার করছেন returnযা কেবল সি 99 এর সাথে কাজ করে এবং পরে এই দুটি অবশ্যই স্পষ্টভাবে বিপরীত ।
রাস্তাজেদি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.