একটি চর অ্যারে সাফ করা গ


104

আমি ভেবেছিলাম প্রথম উপাদানটিকে শূন্য স্থানে সেট করে একটি চর অ্যারের পুরো সামগ্রী মুছে ফেলা হবে।

char my_custom_data[40] = "Hello!";
my_custom_data[0] = '\0';

যাইহোক, এটি কেবল প্রথম উপাদানটি বাতিল করে দেয়।

অথবা

my_custom_data[0] = 0; 

পরিবর্তে ব্যবহারের পরিবর্তে memset, আমি ভেবেছিলাম উপরের দুটি উদাহরণে সমস্ত ডেটা সাফ করা উচিত।


1
জারেড, আপনি সি ++ ট্যাগটি সেট করলেন কেন? তিনি "সি" সম্পর্কে কথা বলেছেন এবং কোনও সি ++ সম্পর্কিত ট্যাগ যুক্ত করেন নি।
জোহানেস স্কাউব -

1
এটি সি ++ তে অক্ষর অ্যারেগুলিতে সমানভাবে প্রযোজ্য, যদিও তিনি নির্দিষ্ট না করে।
অ্যাডাম হাওস

4
আমরা ইতিমধ্যে সি ++ নির্দিষ্ট সমাধান সরবরাহকারী লোকদের সাথে যা দেখেছি তা এড়াতে আমি সি ++ ট্যাগটি সরিয়ে ফেলেছি
অ্যালনিটাক

উত্তর:


113

এটি নির্ভর করে আপনি অ্যারেটি কীভাবে দেখতে চান তার উপর। আপনি যদি অ্যারেটিকে বর্ণের সিরিজ হিসাবে দেখছেন, তবে ডেটা সাফ করার একমাত্র উপায় হ'ল প্রতিটি এন্ট্রি স্পর্শ করা। memsetসম্ভবত এটি অর্জনের সবচেয়ে কার্যকর উপায়।

অন্যদিকে, আপনি যদি এটি সি / সি ++ নাল টার্মিনেটেড স্ট্রিং হিসাবে দেখতে চান, তবে প্রথম বাইটটি 0 এ সেট করা কার্যকরভাবে স্ট্রিং সাফ করবে।


4
উত্তরের তারা মূল শব্দটি 'কার্যকরভাবে'। কেবলমাত্র প্রথম উপাদানটি 0 তে সেট করা শুরু হবে এবং বাকিগুলির এখনও অবধারিত মান রয়েছে তবে আপনি যদি অ্যারেটিকে নাল টার্মিনেটেড স্ট্রিং হিসাবে বিবেচনা করছেন এবং প্রথম উপাদানটি নাল হয়, তবে স্ট্রিংটি খালি বিবেচনা করা হবে।
আর্নল্ড স্পেন্স

প্রকৃতপক্ষে, এটি উত্তর ভাবেন।
জোহানেস স্কাউব -

@ কেপারকোড, ঠিক এই কারণেই অ্যারেটি কীভাবে ব্যবহৃত হচ্ছে তা বোঝা খুব গুরুত্বপূর্ণ।
জেয়ার্ডপাড়

হ্যাঁ, এটি আমার প্রথম পোস্টে আমার বলা উচিত ছিল। চরটি একটি সমাপ্ত স্ট্রিং। সুতরাং হয় এই কৌশলটি করবে। চর [0] = '\ 0'; বা চর [0] = 0. আমি নিশ্চিত নই তবে শুনেছি নাল টার্মিনেটেড স্ট্রিং ব্যবহার করার জন্য '\ 0' ব্যবহার করা ভাল।
ant2009

@ আরবুক, হ্যাঁ আপনি ঠিক বলেছেন। প্রযুক্তিগতভাবে '\ 0' 0 এর সমান (ascii তে) তবে আপনার '\ 0' ব্যবহার করা উচিত কারণ এটি আপনার উদ্দেশ্যটি পরিষ্কার করে দেয়
মার্ক টেস্টা

70

সি-তে একটি অ্যারে কেবল একটি মেমরির অবস্থান, সুতরাং আপনার my_custom_data[0] = '\0';কার্যনির্বাহী কেবল প্রথম উপাদানটিকে শূন্যে সেট করে এবং অন্যান্য উপাদানগুলি অক্ষত রেখে দেয়।

আপনি যদি অ্যারের সমস্ত উপাদান সাফ করতে চান তবে আপনাকে প্রতিটি উপাদানটি দেখতে হবে। এটাই তার memsetজন্য:

memset(&arr[0], 0, sizeof(arr));

এটি যত্ন নেওয়ার জন্য এটি সবচেয়ে দ্রুততম উপায়। আপনি যদি সি ++ ব্যবহার করতে পারেন তবে পরিবর্তে std :: ভরাট বিবেচনা করুন:

char *begin = &arr;
char *end = begin + sizeof(arr);
std::fill(begin, end, 0);

1
আমি বিশ্বাস করি যে দ্বিতীয় সংস্করণটি হওয়া উচিত: স্টেডিয়াম :: ফিল (আরআর, আরআর + সাইজফ (আরআর) / সাইজফ (আরআর [0]), 0);
ডেভিড রদ্রিগেজ - শুকনো

স্পষ্টতা: পূর্ণ আকারের সাথে ব্যবহার করবেন না কারণ আপনি পরে ইনট, লম্বা, ডাবল বা আপনার কীসের অ্যারে নিয়ে সমস্যায় পড়বেন।
জাঙ্ক লিংস

আমি পছন্দ করি: এসটিডি :: ফিল (& আরআর [0], এবং আরআর [আরআর_লেন], 0);
জ্যান লিংস

জ্যান লিনাক্স, এটি অপরিবর্তিত আচরণ। আপনি আর আরআর করতে পারবেন না r তবে আপনাকে স্টাড :: ভরাট করতে হবে (আরআর, আরআর + সাইজ অফ আরার, 0); অথবা যদি আপনার কোথাও দৈর্ঘ্য থাকে তবে স্ট্যান্ড :: ফিল (এআরআর, আরআর + অ্যারে_লেন, 0); চরের একটি অ্যারে ধরে
নিচ্ছেন

এটি কেবল সি তে বৈধ। যদিও প্রশ্নটি স্পষ্টভাবে সি লক্ষ্য করেছে (অন্য একজন লোক একটি সি ++ ট্যাগ যুক্ত করেছে, আমার কোনও কারণ নেই কেন), এসটিডি :: ফিল সিটি ++ অ্যাফিনিটি দেখায় :)
জোহানেস স্কাউব - লিটব

25

আপনি কেন ভাবেন যে একটি একক উপাদান সেট করা পুরো অ্যারে সাফ করবে? সি তে, বিশেষত, প্রোগ্রামার এটি স্পষ্টভাবে প্রোগ্রাম না করে খুব কমই ঘটে। যদি আপনি প্রথম উপাদানটি শূন্য (বা কোনও মান) তে সেট করে থাকেন তবে আপনি ঠিক এটি করেছেন এবং এর চেয়ে বেশি কিছুই নয়।

আরম্ভ করার সময় আপনি শূন্যে একটি অ্যারে সেট করতে পারেন:

char mcd[40] = {0}; /* sets the whole array */

অন্যথায়, আমি স্মৃতি ছাড়া অন্য কোনও কৌশল বা অনুরূপ কিছু জানি না।


আমি অনুমান করি এটি আপনার ব্যবহৃত
সংকলকটির

1
@ কোকোফান: না, এটি সংকলক নির্ভর নয়। এটি ভাষা নির্দিষ্টকরণের অংশ। যে কোনও সংকলক আলাদাভাবে আচরণ করে সে সি ভাষা অনুসরণ করে না।
অ্যাবেলেঙ্কি

আমি এটা জানতাম না, ধন্যবাদ। আমি এই বিশেষ ক্ষেত্রে যেখানে পড়তে পারি তার কোনও সংস্থান খুঁজে পাইনি। এটি বুকমার্ক হিসাবে পেয়ে ভাল লাগবে।
কোকোফান

1
একে আংশিক সূচনা বলে। আমার কাছে C99 স্পেস নেই, তবে এখানে দুটি উত্স রয়েছে: বিট.ইল / en বিবি 2 এম "আপনাকে কোনও অ্যারেতে সমস্ত উপাদান আরম্ভ করার দরকার নেই an অ্যারে আংশিকভাবে আরম্ভ করা হয়, এমন উপাদানগুলি যা আরম্ভ হয় না তার মান 0 পায় receive উপযুক্ত টাইপ। " বিট.ইলি / এফএইচএইচএইচ "" অ্যারেতে উপাদানগুলির তুলনায় যদি প্রাথমিকের সংখ্যা কম থাকে তবে অবশিষ্ট উপাদানগুলি স্বয়ংক্রিয়ভাবে 0তে শুরু হয়
অ্যাবেলেঙ্কি

এটি এমন কোনও অ্যারের ক্ষেত্রে প্রযোজ্য নয় যা ইতিমধ্যে ঘোষণা করা হয়েছে এবং নির্ধারিত মানগুলি এটি করে?
স্কিনডনাকলস

10

ব্যবহার করুন:

memset(my_custom_data, 0, sizeof(my_custom_data));

বা:

memset(my_custom_data, 0, strlen(my_custom_data));

1
দ্বিতীয় বিকল্প ( memset(my_custom_data, 0, strlen(my_custom_data));) কেবল প্রথম '\ 0' এ পরিষ্কার হবে, যা অ্যারের শেষের বাইরে হতে পারে। এটি ঠিক আছে, নাও হতে পারে।
ব্রিউম্যান্জ

9

নিম্নলিখিত কোড ব্যবহার করে দেখুন:

void clean(char *var) {
    int i = 0;
    while(var[i] != '\0') {
        var[i] = '\0';
        i++;
    }
}

2
এফওয়াইআই - ইনডেন্ট কোডটি 4 টি স্পেসে বা এটি নির্বাচন করুন এবং 'কোড' বোতামটি টিপুন, যা বাইনারি দুটি লাইনের মতো দেখাচ্ছে।
মেগার

মেমসেটের () এর জন্য আপনি যদি স্ট্রিং। অন্তর্ভুক্ত না করতে চান তবে দুর্দান্ত সমাধান।
আকাশ আগারওয়াল

7

কেন ব্যবহার memset()করবেন না ? এটি কিভাবে করা যায়।

প্রথম উপাদানটি সেট করা বাকী মেমরিটিকে ছোঁয়া ছেড়ে দেয় তবে str ফাংশন ডেটা খালি হিসাবে বিবেচনা করে will


1
ব্যবহার করবেন না memset উপর পাঠযোগ্যতা: stackoverflow.com/questions/453432/...
জোহান Gerell

1
এবং তাহলে আপনার উত্তর কি?
এমকেবি

6

দয়া করে নীচে সন্ধান করুন যেখানে আমি কেস 1 এবং কেস 2 পরে অ্যারের সাথে ডেটা দিয়ে ব্যাখ্যা করেছি।

char sc_ArrData[ 100 ];
strcpy(sc_ArrData,"Hai" );

মামলা 1:

sc_ArrData[0] = '\0';

ফলাফল:

-   "sc_ArrData"
[0] 0 ''
[1] 97 'a'
[2] 105 'i'
[3] 0 ''

কেস 2:

memset(&sc_ArrData[0], 0, sizeof(sc_ArrData));

ফলাফল:

-   "sc_ArrData"
[0] 0 ''
[1] 0 ''
[2] 0 ''
[3] 0 ''

যদিও NUL- তে প্রথম যুক্তি নির্ধারণ করা কৌশলটি করবে তবে মেমসেট ব্যবহার করা বাঞ্ছনীয়


4

নাঃ। আপনি যা করছেন তা হ'ল '\ 0' বা 0 তে প্রথম মান সেট করা।

আপনি যদি নাল টার্মিনেটেড স্ট্রিংগুলির সাথে কাজ করছেন, তবে প্রথম উদাহরণে, আপনি এমন আচরণ পাবেন যা আপনার প্রত্যাশার নকল করে, তবে মেমরিটি এখনও সেট করা নেই।

আপনি যদি মেমসেট ব্যবহার না করে মেমরিটি সাফ করতে চান তবে লুপের জন্য একটি ব্যবহার করুন।


আমি লুপের জন্য না বলি। আপনার নিজের "উন্নত" (এবং সাধারণত না) গ্রন্থাগারের ফাংশন না লেখার চেষ্টা করুন। প্রকৃতপক্ষে, মেমসেট এবং মেমকিটি বরং বিশেষ হয় ডেটা প্রান্তিককরণ এবং দৈর্ঘ্যের বিষয়ে যা জানা যায় তার ভিত্তিতে প্রায়শই সিপিইউর জন্য কাস্টম মেশিন কোডের সাথে .োকানো হয়।
জ্যান লিনাক্স

@ জ্যান ওপি মেমসেটটি ব্যবহার করতে চায় না (সম্ভবত তিনি এম্বেড করেছেন এবং এটি উপলব্ধ নেই)। তবে হ্যাঁ, মেমসেটটি সাধারণত অত্যন্ত অনুকূল এবং লুপের জন্য সম্ভবত দ্রুততর হয় faster
অ্যাডাম হাউস

সত্য, তবে তিনি মেমসেটটি ব্যবহার করতে চান না, তাই আমি লুপের জন্য একটি পরামর্শ দিলাম।
অ্যালান

3

আপনার মেমসেট ব্যবহার করা উচিত। কেবলমাত্র প্রথম উপাদানটি সেট করা কাজ করবে না, আপনাকে সমস্ত উপাদান সেট করতে হবে - যদি তা না হয় তবে আপনি কেবলমাত্র প্রথম উপাদানটি 0 এ সেট করতে পারেন?


: memset পাঠযোগ্যতা উপর ব্যবহার করা উচিত নয় stackoverflow.com/questions/453432/...
জোহান Gerell

2

প্রথম চরিত্রটিতে একটি নাল চরিত্র লেখা ঠিক তা করে। যদি আপনি এটিকে স্ট্রিং হিসাবে বিবেচনা করেন, নাল টার্মিনেশন চরিত্রের আনুগত্যকারী কোড এটিকে নাল স্ট্রিং হিসাবে বিবেচনা করবে, তবে এটি ডেটা সাফ করার মতো নয়। যদি আপনি আসলে ডেটা সাফ করতে চান তবে আপনাকে মেমসেট ব্যবহার করতে হবে।



1

আমি ভেবেছিলাম প্রথম উপাদানটিকে শূন্য স্থানে সেট করে একটি চর অ্যারের পুরো সামগ্রী মুছে ফেলা হবে।

আপনি আবিষ্কার হিসাবে এটি সঠিক নয়

যাইহোক, এটি কেবল প্রথম উপাদানটি বাতিল করে দেয়।

একদম ঠিক!

সমস্ত ডেটা সাফ করার জন্য আপনাকে মেমসেট ব্যবহার করতে হবে, এন্ট্রিগুলির কোনও একটি শূন্য করার জন্য এটি যথেষ্ট নয়।

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


: পাঠযোগ্যতা ওভার "memset" ব্যবহার করবেন না stackoverflow.com/questions/453432/...
জোহান Gerell

1

প্রথম উপাদানটি নূলে সেট করুন। চর অ্যারে মুদ্রণ আপনাকে আর কিছুই ফিরিয়ে দেবে না।



-3
void clearArray (char *input[]){
    *input = ' '; 
}

1
এটি ক্লিয়ারিং নয়, এটি '' এ প্রথম চরিত্র স্থাপন করছে! আমার মনে হয় আপনি * ইনপুট = '\ 0' লিখতে চেয়েছিলেন
স্টিভিপার

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