আউটপুটে সমান দৈর্ঘ্য পেতে প্রিন্টফ () ব্যবহার করে স্ট্রিংগুলি কীভাবে বিন্যাস করবেন?


97

আমার দুটি ফাংশন রয়েছে, একটি যা বার্তাগুলি তৈরি করে Starting initialization...এবং অন্যটি যা কোডগুলি এবং আউটপুটগুলির রিটার্ন পরীক্ষা করে "Ok", "Warning"বা "Error"। তবে উত্পাদিত আউটপুটটি বিভিন্ন দৈর্ঘ্যের হয়:

Starting initialization...Ok.
Checking init scripts...Ok.

আমি কীভাবে এরকম কিছু পেতে পারি:

Starting initialization...       Ok.
Checking init scripts...         Ok.

উত্তর:


164

আপনি স্ট্রিং ক্ষেত্রগুলিতে প্রস্থ নির্দিষ্ট করতে পারেন, যেমন

printf("%-20s", "initialization...");

এবং তারপরে যে ক্ষেত্রটি মুদ্রিত হয়েছে তা আপনার নির্দেশিত প্রস্থের ফাঁকা প্যাডযুক্ত হবে।

-যে বাক্সে আপনার টেক্সট বাঁ-যথার্থ।


130
হায়, আমি এত বেশি গুনতে পারছি না not যাইহোক, আমি আমার উদাহরণ থেকে
বহির্ভূত হওয়ার পক্ষে অনুরোধকারীকে

4
ঠিক কি ন্যায়সঙ্গত?
কেএন্ডআর

9
ডান ন্যায়সঙ্গত হয় ডিফল্ট। এ ছাড়া -আপনার ডেটা এমন ক্ষেত্রটিতে ঠিক ন্যায়সঙ্গত হবে যার প্রস্থ আপনি নির্দিষ্ট করেছেন।
কার্ল স্মট্রিক্জ

25

printfপ্রস্থ স্পেসিফায়ারগুলির সাথে ফর্ম্যাট করার অনুমতি দেয়। যেমন


printf( "%-30s %s\n", "Starting initialization...", "Ok." );

বাম-ন্যায়সঙ্গততা নির্দেশ করতে আপনি নেতিবাচক প্রস্থের নির্দিষ্টকরণকারী ব্যবহার করবেন কারণ ডিফল্টটি ডান-ন্যায়সঙ্গত ব্যবহার করতে হয় use


20

তদতিরিক্ত, যদি আপনি এটির পছন্দসই স্বাচ্ছন্দ্য চান তবে আপনি widthনিম্নলিখিত দুটি ফর্ম্যাটগুলির মধ্যে একটি (ট্র্যাঙ্কেশন বা ছাড়াই) চয়ন করতে পারেন:

int width = 30;
//no truncation uses %-*s
printf( "%-*s %s\n", width, "Starting initialization...", "Ok." );
// output is "Starting initialization...     Ok."

//truncated to the specified width uses %-.*s
printf( "%-.*s %s\n", width, "Starting initialization...", "Ok." ); 
// output is "Starting initialization... Ok."

13

এমন কিছু %nসংশোধকও রয়েছে যা নির্দিষ্ট পরিস্থিতিতে সহায়তা করতে পারে। এটি স্ট্রিংটি এতক্ষণ যে কলামটিতে ছিল তা ফিরিয়ে দেয়। উদাহরণ: আপনি কয়েকটি সারি লিখতে চান যা প্রথম সারির প্রস্থের মধ্যে একটি টেবিলের মতো থাকে।

int width1, width2;
int values[6][2];
printf("|%s%n|%s%n|\n", header1, &width1, header2, &width2);

for(i=0; i<6; i++)
   printf("|%*d|%*d|\n", width1, values[i][0], width2, values[i][1]);

দুটি স্ট্রিং header1এবং এর যে দৈর্ঘ্যের দৈর্ঘ্যের একই প্রস্থের 2 টি কলাম প্রিন্ট করবে header2। আমি জানি না যে সমস্ত বাস্তবায়নের মধ্যে %nসোলারিস এবং লিনাক্স আছে কি না।


এই সমাধানটি কার্যকর হয়, তবে যে কেউ এটিকে গ্রহণ করে এবং তাদের কোডে রাখে তাদের মেমরির দুর্বলতাগুলি প্রবর্তনের ঝুঁকি সম্পর্কে সচেতন হওয়া উচিত ।
ম্যাথু কোল

0

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


-2

ট্যাব ব্যবহার করে শুরু করুন, character t অক্ষর সংশোধক। এটি স্থির স্থানে (কলাম, টার্মিনাল লিঙ্গো) অগ্রসর হবে। তবে কলামের প্রস্থের চেয়ে বেশি পার্থক্য থাকলে (4 টি অক্ষর, যদি আমি সঠিকভাবে স্মরণ করি) এটি সাহায্য করে না।

এটি ঠিক করতে, আপনার "ঠিক আছে / নোক" স্টাফগুলি স্থির সংখ্যক ট্যাব ব্যবহার করে লিখুন (5? 6? এটি চেষ্টা করুন), তারপরে নতুন-আস্তরণ ছাড়াই ( \ r ) ফিরে আসুন এবং আপনার বার্তাটি লিখুন।


4
সর্বদা এই ঝুঁকি থাকে যে কোনও স্ট্রিং একটি ট্যাব থামানোর চেয়ে দীর্ঘ হয় যার ফলে ফলস্বরূপ ট্যাব এবং পাঠ্যকে ভুলভাবে সংযুক্ত করতে বাধ্য করা হয়।
পিপি

আসলেই নয় ... প্রথমে ট্যাব ঠিক আছে / এনওকে লিখুন, তারপরে / আর, এখন বাক্যাংশটি লিখুন, এখন / এন। শব্দগুচ্ছটি ঠিক আছে / এনওকে ওভাররাইট করতে পারে। তবে আপনার উপায়টি আরও ভাল, আমি নেতিবাচক ন্যায়সঙ্গততা সম্পর্কে জানতাম না।
jpinto3912
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.