'\ 0' এবং প্রিন্টফ () সি তে


21

সি এর একটি প্রারম্ভিক কোর্সে, আমি শিখেছি যে স্ট্রিংগুলি সঞ্চয় করার \0সময় এর শেষে নাল অক্ষর দিয়ে সংরক্ষণ করা হয় । তবে আমি যদি কোনও স্ট্রিং মুদ্রণ করতে চাইতাম তবে কী বলে printf("hello")যে আমি খুঁজে পেয়েছি যে এটি শেষ হয় না\0 বিবৃতি অনুসরণ করে

printf("%d", printf("hello"));

Output: 5

তবে এটি অসঙ্গত বলে মনে হচ্ছে, যতদূর আমি জানি যে স্ট্রিংয়ের মতো পরিবর্তনশীল মূল স্মৃতিতে সঞ্চয় হয় এবং আমি অনুমান করি যে এটি মুদ্রণ করার সময় এটি মূল স্মৃতিতেও সংরক্ষণ করা যেতে পারে তবে কেন পার্থক্য?


1
আপনার কোডটি কমপক্ষে মিস করেছে তা ছাড়াও );আপনি সেই কোডটি দিয়ে কী দেখানোর ইচ্ছা রাখছেন? আপনি কীভাবে প্রমাণ করেছেন যে এটি একটি দিয়ে শেষ হয় না \0?
glglgl

এবং এটি মেমোরিতে কী সঞ্চিত আছে, এর সাথে কী করার আছে?
সাকিরোগ্লো ফোটিস

সিতে সমস্ত আক্ষরিক স্ট্রিংগুলি সত্যই অক্ষরের অ্যারে হয়, যার মধ্যে নাল-টার্মিনেটর অন্তর্ভুক্ত থাকে
কিছু প্রোগ্রামার ড্যুডে

@glglgl আমি মনে করি যে প্রিন্টফ () স্ক্রিনে মুদ্রণ করার জন্য অনুমিত হয় তার সংখ্যাটি ফিরিয়ে দেয়।
অজয় মিশ্র

4
@ অজয়মিশ্রা হ্যাঁ, এবং এটিতে অবশ্যই 5 টি অক্ষর মুদ্রিত হওয়া উচিত ছিল। সমাপ্ত 0 বাইট স্ক্রিনে মুদ্রণ করা হয় না।
glglgl

উত্তর:


13

নাল বাইট একটি স্ট্রিংয়ের শেষে চিহ্নিত করে। এটি স্ট্রিংয়ের দৈর্ঘ্যে গণনা করা হয় না এবং যখন স্ট্রিংটি মুদ্রিত হয় তখন মুদ্রিত হয় নাprintf । মূলত, নাল বাইট এমন ফাংশনগুলিকে বলে যেগুলি স্ট্রিং ম্যানিপুলেশন করে যখন থামবে।

আপনি যদি charকোনও স্ট্রিং দিয়ে আরেটিভ করা অ্যারে তৈরি করেন তবে একটি পার্থক্যটি আপনি দেখতে পাবেন । sizeofঅপারেটরটি ব্যবহার করে নাল বাইট সহ অ্যারের আকার প্রতিবিম্বিত হবে। উদাহরণ স্বরূপ:

char str[] = "hello";
printf("len=%zu\n", strlen(str));     // prints 5
printf("size=%zu\n", sizeof(str));    // prints 6

আমি ভাবলাম গল্পটি অন্যরকম হবে printf()। টিবিএইচ আমি জানি না কীভাবে printf()কাজ করে।
অজয় মিশ্র

8

printfমুদ্রিত অক্ষরের সংখ্যা প্রদান করে। '\0'মুদ্রিত নয় - এটি কেবলমাত্র এই সংকেত দেয় যে এই স্ট্রিংটিতে আর কোনও অক্ষর নেই। এটি পাশাপাশি স্ট্রিং দৈর্ঘ্যের দিকেও গণনা করা হয় না

int main()
{
    char string[] = "hello";

    printf("szieof(string) = %zu, strlen(string) = %zu\n", sizeof(string), strlen(string));
}

https://godbolt.org/z/wYn33e

sizeof(string) = 6, strlen(string) = 5

6

আপনার অনুমান ভুল আপনার স্ট্রিং আসলে একটি দিয়ে শেষ হয়\0

5 অক্ষরের রয়েছে h, e, l, l,o এবং 0 অক্ষর।

"অভ্যন্তরীণ" print()কল আউটপুটগুলি কী মুদ্রিত হয়েছে এমন অক্ষরের সংখ্যা এবং এটি 5।


6

সিতে সমস্ত আক্ষরিক স্ট্রিংগুলি সত্যই অক্ষরের অ্যারে হয়, যার মধ্যে নাল-টার্মিনেটর অন্তর্ভুক্ত থাকে।

তবে নাল টার্মিনেটর একটি স্ট্রিং (আক্ষরিক বা না) এর দৈর্ঘ্যে গণনা করা হয় না এবং এটি মুদ্রিত হয় না। নাল টার্মিনেটর পাওয়া গেলে মুদ্রণ বন্ধ হয়ে যায়।


কোনও অ্যারেতে স্ট্রিংটি সংরক্ষণ না করে এটি যাচাই করার উপায় আছে কি?
অজয় মিশ্র

1
@AjayMishra ওয়েল স্ট্রিং ইতিমধ্যে হয় (যেমন উল্লেখ) একজন অ্যারের মধ্যে ... কিন্তু যদি সেখানে ছিলাম না একটি নাল টারমিনেটর তারপর printfস্ট্রিং এর সীমার বাইরে যেতে হবে, এবং ছাপি "র্যান্ডম" অথবা "আবর্জনা" অক্ষর, এবং বিনিময়ে একটি স্ট্রিংয়ের দৈর্ঘ্যের চেয়ে পৃথক সংখ্যা। আপনি যদি ইতিমধ্যে স্ট্রিংয়ের দৈর্ঘ্যটি জানেন তবে আপনি এটিও পরীক্ষা করতে পারবেন যে সূচকের অক্ষরটি '\0'কাজ করবে তবে এটি প্রযুক্তিগতভাবে অপরিজ্ঞাত আচরণে যদি অ্যারের আকারটি টার্মিনেটরটি অন্তর্ভুক্ত না করে (যেমনটি এতে char arr[5] = "hello";যোগ না করে) অ্যারে টার্মিনেটর)।
কিছু প্রোগ্রামার ড্যুডে

@ অজয়মিশ্রা হ্যাঁ ই। জি।, আপনি char * p = "Hello"; int i = 0; while (p[i] != '\0') { printf("%d: %c", i, p[i]); i++; }এটি দেখতে পারেন এবং এটি কীভাবে চলতে পারে: এটি সূচী এবং সেই লাইনে থাকা সামগ্রীর সাথে রেখা প্রদর্শন করে। ইনডেক্স 4 এর পরে এটি 0 টি অক্ষর খুঁজে বের করে যখন লুপটি ভেঙে দেয়। সেখানে আপনি দেখতে পাচ্ছেন যে একটি 0 টি অক্ষর রয়েছে।
glglgl

6

সমস্ত উত্তরগুলি সত্যিই ভাল তবে আমি এই সমস্তগুলি সম্পূর্ণ করার জন্য আরও একটি উদাহরণ যুক্ত করতে চাই

#include <stdio.h>

int main()
{
    char a_char_array[12] = "Hello world";

    printf("%s", a_char_array);
    printf("\n");

    a_char_array[4] = 0; //0 is ASCII for null terminator

    printf("%s", a_char_array);
    printf("\n");

    return 0;
}

যারা অনলাইন জিডিবিতে এটি চেষ্টা করতে চান না তাদের জন্য আউটপুটটি হ'ল:

ওহে বিশ্ব

জাহান্নাম

https://linux.die.net/man/3/printf

এই পলায়ন টার্মিনেটর কি বোঝে সহায়ক? এটি কোনও চর অ্যারে বা স্ট্রিংয়ের সীমানা নয়। এটি এমন চরিত্র যা এই লোকটিকে বলবে যে পার্স- STOP, (মুদ্রণ) পার্স করে এখানে।

PS: এবং যদি আপনি এটি পার্স করে এবং এটি একটি চর অ্যারে হিসাবে মুদ্রণ করেন

for(i=0; i<12; i++)
{
    printf("%c", a_char_array[i]);
}
printf("\n");

তুমি পাও:

জাহান্নামের দুনিয়া

যেখানে ডাবল এল এর পরে শ্বেতস্পেস হল নাল টার্মিনেটর, তবে একটি গৃহস্থালি অ্যারে পার্সিং করলে প্রতি বাইটের চর মান হবে। আপনি যদি অন্য কোনও বিশ্লেষণ করেন এবং প্রতিটি বাইটের ("% d%, চর_আরে [i]) এর মান মান মুদ্রণ করেন তবে আপনি দেখতে পাবেন যে (আপনি ASCII কোড-ইন উপস্থাপনা পাবেন) শ্বেত স্পেসের মান 0 হয়।


4

ইন Cফাংশন printf()মুদ্রিত চরিত্রের নম্বর দেখায়, \0একটি হল nullটারমিনেটর যা গ ভাষায় স্ট্রিংয়ের শেষ প্রান্ত নির্দেশ করতে ব্যবহৃত হয় এবং কোন সালে নির্মিত হয় stringহিসাবে টাইপ c++, তবে আপনার অ্যারের আকার চাহিদা সংখ্যার চেয়ে অন্তত বৃহত্তর হতেchar যদি আপনি চান জমানো.

রেফ এখানে: সিপিপি রেফ প্রিন্টফ ()


3

তবে আমি যদি কোনও স্ট্রিং মুদ্রণ করতে চাইতাম তবে প্রিন্টফ ("হ্যালো") বলুন যদিও আমি খুঁজে পেয়েছি যে নীচের বিবৃতি দিয়ে \ 0 দিয়ে শেষ হয় না

printf("%d", printf("hello"));

Output: 5

আপনি ভুল. এই বিবৃতিটি নিশ্চিত করে না যে স্ট্রিং আক্ষরিক "hello"সমাপ্ত শূন্য অক্ষরের সাথে শেষ হয় না '\0'। এই বিবৃতি নিশ্চিত করেছে যে ফাংশনprintf সমাপ্তি শূন্য অক্ষরের সম্মুখীন না হওয়া অবধি একটি স্ট্রিংয়ের উপাদানগুলিকে আউটপুট করে।

আপনি যখন উপরের স্টেটমেন্টের মতো স্ট্রিং আক্ষরিক ব্যবহার করছেন তখন সংকলক স্থিতিশীল স্টোরেজ সময়কাল সহ একটি অক্ষর অ্যারে তৈরি করে যার মধ্যে স্ট্রিং আক্ষরিক উপাদান রয়েছে।

সুতরাং বাস্তবে এই অভিব্যক্তি

printf("hello")

নিম্নলিখিত মত কিছু সংকলক দ্বারা প্রক্রিয়া করা হয়

static char string_literal_hello[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
printf( string_literal_hello );

এটিতে ফাংশন প্রিন্টফের এই ক্রিয়াটি আপনি নিম্নোক্ত উপায়ে কল্পনা করতে পারেন

int printf( const char *string_literal )
{
    int result = 0;

    for ( ; *string_literal != '\0'; ++string_literal )
    {    
        putchar( *string_literal );
        ++result;
    }

    return result;
}

আক্ষরিক "হ্যালো" স্ট্রিংয়ে থাকা অক্ষরের সংখ্যা পেতে আপনি নিম্নলিখিত প্রোগ্রামটি চালাতে পারেন

#include <stdio.h>

int main(void) 
{
    char literal[] = "hello";

    printf( "The size of the literal \"%s\" is %zu\n", literal, sizeof( literal ) );

    return 0;
}

প্রোগ্রাম আউটপুট হয়

The size of the literal "hello" is 6

0

আপনাকে প্রথমে আপনার ধারণাটি সাফ করতে হবে .. আপনি যখন অ্যারে নিয়ে কাজ করবেন তখন এটি পরিষ্কার হয়ে যাবে, আপনি যে প্রিন্ট কমান্ডটি ব্যবহার করছেন সেটি কেবলমাত্র প্যারান্থেসিসের মধ্যে রাখা অক্ষর গণনা করছে। অ্যারে স্ট্রিংয়ে এটি প্রয়োজনীয় যে এটি \ 0 দিয়ে শেষ হবে


0

একটি স্ট্রিং অক্ষরের ভেক্টর is অক্ষরের ক্রম রয়েছে যা স্ট্রিং গঠন করে, তার পরে বিশেষ সমাপ্তি চরিত্রের স্ট্রিং থাকে: '\ 0'

উদাহরণ: চর টিআর [10] = {'এইচ', 'ই', 'ল', 'ল', 'ও', '\ 0'};

উদাহরণ: নিম্নলিখিত অক্ষর ভেক্টরটি একটি স্ট্রিং নয় কারণ এটি '\ 0' দিয়ে শেষ হয় না

চর টিআর [2] = {'এইচ', 'ই'};


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