প্রিন্টফের সাহায্যে অগ্রণীকরণের পরিবর্তে কেন নতুন নতুন লাইনের ব্যবহার?


79

আমি শুনেছি ব্যবহারের সময় আপনার নতুন নেতৃত্বগুলি এড়ানো উচিত printf। যাতে আপনার পরিবর্তে printf("\nHello World!")ব্যবহার করা উচিতprintf("Hello World!\n")

উপরের এই বিশেষ উদাহরণে এটি বোঝা যায় না, যেহেতু আউটপুটটি ভিন্ন হবে তবে এটি বিবেচনা করুন:

printf("Initializing");
init();
printf("\nProcessing");
process_data();
printf("\nExiting");

তুলনা করা:

printf("Initializing\n");
init();
printf("Processing\n");
process_data();
printf("Exiting");

পিছনে থাকা নতুন লাইনের সাথে আমি কোনও সুবিধা দেখতে পাচ্ছি না, এটি আরও ভাল দেখায়। অন্য কোন কারণ আছে?

সম্পাদনা করুন:

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


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

46
শেষ লাইনটি কোনও পূর্ববর্তী নিউলাইন ছাড়াই লিনাক্সের কমান্ড প্রম্পটের সাথে একত্রীভূত হবে।
গ্র্যান্ডমাস্টারবি

4
যদি এটি "আরও ভাল দেখায়" এবং এর কোনও খারাপ দিক না থাকে, এটি করার পক্ষে এটি যথেষ্ট কারণ IM ভাল কোড লেখা ভাল উপন্যাস বা একটি ভাল প্রযুক্তিগত কাগজ লেখার চেয়ে আলাদা নয় - শয়তান সর্বদা বিশদে থাকে।
আলেফজেরো

5
কি init()এবং process_data()কিছু নিজেদের মুদ্রণ? ফলাফলটি যদি তারা এমনটি করে তবে আপনি কী দেখতে আশা করবেন?
বার্গি

9
\nএকটি লাইন টার্মিনেটর , কোনও লাইন বিভাজক নয় । এটি ইউনিক্স-এ টেক্সট ফাইলগুলি প্রায় সর্বদা শেষ হওয়ার বিষয়টি দ্বারা প্রমাণিত \n
জোনাথন রাইনহার্ট

উত্তর:


222

টার্মিনাল I / O এর মোটামুটি পরিমাণ লাইন-বাফার , সুতরাং message n দিয়ে কোনও বার্তা শেষ করে আপনি নিশ্চিত হতে পারেন যে এটি একটি সময়োচিতভাবে প্রদর্শিত হবে। শীর্ষস্থানীয় With n সহ বার্তাটি একবারে প্রদর্শিত হতে পারে বা নাও হতে পারে। প্রায়শই, এর অর্থ হ'ল প্রতিটি পদক্ষেপ পূর্ববর্তী পদক্ষেপের অগ্রগতি বার্তা প্রদর্শন করে , যা কোনও প্রোগ্রামের আচরণ বোঝার চেষ্টা করার সময় বিভ্রান্তির শেষ না হয় এবং সময় নষ্ট করে দেয় causes


20
ক্রাশ হওয়া প্রোগ্রামটি ডিবাগ করার জন্য প্রিন্টফ ব্যবহার করার সময় এটি বিশেষভাবে গুরুত্বপূর্ণ। একটি প্রিন্টফের শেষে নিউলাইন স্থাপন করা মানে কনসোলের স্টাডাউট প্রতিটি প্রিন্টফের দিকে ফ্লাশ হয়ে যায়। (উল্লেখ্য যখন stdout- এ একটি ফাইল থেকে আপনাকে পুনঃনির্দেশিত করা হয়, এসটিডি লাইব্রেরি সাধারণত ব্লক লাইন বাফারিং পরিবর্তে বাফার উপলব্ধ তা পূর্ণ করব, যাতে এমনকি শেষে রাখুন NEWLINE বেশ কঠিন একটি ক্র্যাশ ডিবাগ printf, তোলে।)
এরিক Eidt

25
@ এরিকইডট নোট করুন যে fprintf(STDERR, …)পরিবর্তে আপনার ব্যবহার করা উচিত , যা সাধারণত ডায়াগনস্টিক আউটপুট জন্য মোটেও বাফার হয় না।
উত্সাহীকারী

4
@ ডেডুপ্লিকেটর ত্রুটি প্রবাহে ডায়াগনস্টিক বার্তাগুলি লেখার পাশাপাশি এর ডাউনসাইডসও রয়েছে - অনেকগুলি স্ক্রিপ্ট ধরে নেয় যে কোনও ত্রুটি প্রবাহে কিছু লেখা থাকলে কোনও প্রোগ্রাম ব্যর্থ হয়েছে।
ভু

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

23
@ ভু: আপনি কোন প্রোগ্রামগুলি বর্ণনা করছেন? আপনার বর্ণনার মতো আচরণ করে এমন কোনও বহুল ব্যবহৃত সফ্টওয়্যার প্যাকেজ সম্পর্কে আমি সচেতন নই। আমি জানি যে এখানে এমন প্রোগ্রাম রয়েছে যা আমি করি তবে এটি আমি ঠিক করি না যে আমি উপরে বর্ণিত কনভেনশনটি করেছি: ইউনিক্স বা ইউনিক্সের মতো পরিবেশের কাজকর্মের বেশিরভাগ প্রোগ্রাম এইভাবে এবং আমার জ্ঞানের পথে প্রোগ্রাম সংখ্যাগরিষ্ঠ সবসময় আছে। স্ট্যাডারকে লেখা এড়াতে আমি কোনও প্রোগ্রামের পক্ষে অবশ্যই সমর্থন করব না কারণ কিছু স্ক্রিপ্টগুলি এটি ভালভাবে পরিচালনা করে না।
ড্যানিয়েল প্রাইডেন

73

পসিক্স সিস্টেমে (মূলত যে কোনও লিনাক্স, বিএসডি, যে কোনও ওপেন-সোর্স ভিত্তিক সিস্টেম আপনি সন্ধান করতে পারেন), একটি লাইন একটি অক্ষরের স্ট্রিং হিসাবে সংজ্ঞায়িত হয় যা একটি নিউলাইন দ্বারা সমাপ্ত হয় \n। এই প্রাথমিক ধৃষ্টতা সব মান কমান্ড লাইন টুলস উপর, (কিন্তু সীমাবদ্ধ নয়) সহ বানাতে পারবে wc, grep, sed, awk, এবং vim। এই কারণেই কিছু সম্পাদক (পছন্দসই vim) \nকোনও ফাইলের শেষে সর্বদা একটি যুক্ত করেন এবং সি এর পূর্ববর্তী মানগুলিকে একটি \nচরিত্রের সাথে শেষ হওয়ার জন্য কেন প্রয়োজন হয় ।

বিটিডাব্লু: \nটার্মিনেটেড লাইনগুলি পাঠ্যের প্রক্রিয়াকরণকে আরও সহজ করে তোলে: আপনি নিশ্চিতভাবেই জানেন যে আপনি যখন এই টার্মিনেটরটি পেয়েছেন তখন একটি সম্পূর্ণ লাইন পেয়েছেন। এবং আপনি নিশ্চিতভাবে জানেন যে আপনার যদি এখনও সেই টার্মিনেটরের মুখোমুখি না হয় তবে আপনাকে আরও অক্ষরগুলি দেখার প্রয়োজন।

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


25
এটি সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ের প্রাচীনতম বিতর্কগুলির মধ্যে একটি: লাইন টার্মিনেটর বা লাইন বিভাজক হিসাবে নিউলাইনগুলি (বা, একটি প্রোগ্রামিং ভাষায়, অন্য একটি "স্টেটমেন্টের শেষে" চিহ্নিতকারী) ব্যবহার করা কি ভাল? উভয় পদ্ধতির তাদের পক্ষে মতামত রয়েছে। উইন্ডোজ ওয়ার্ল্ড বেশিরভাগই এই ধারণা নিয়ে স্থির হয়েছে যে নিউলাইন সিকোয়েন্সটি (যা সাধারণত সেখানে সিআর এলএফ হয়) একটি লাইন বিভাজক , এবং এইভাবে কোনও ফাইলের শেষ লাইনটি এটির সাথে শেষ হওয়ার দরকার নেই। ইউনিক্স বিশ্বে, যদিও, একটি নিউলাইন সিকোয়েন্স (এলএফ) একটি লাইন টার্মিনেটর এবং এই অনুমানের চারপাশে অনেকগুলি প্রোগ্রাম নির্মিত হয়।
ড্যানিয়েল প্রাইডেন

33
POSIX এমনকি সংজ্ঞায়িত হিসাবে একটি লাইন "শূন্য বা তার বেশি অ সম্পর্কে newline বর্ণের একটি ক্রম প্লাস একটি সসীম সম্পর্কে newline অক্ষর।"
পাইপ

6
@ পাইপ যেমন বলেছে যে এটি পসিক্স স্পেসিফিকেশনে রয়েছে, আমরা সম্ভবত উত্তরটি হিসাবে ডি ফিউচারের বিপরীতে তাকে ডি জুরে বলতে পারি ?
বাল্ড্রিক

4
ঠিক আছে আমি আমার উত্তরটি আরও ইতিবাচক হওয়ার জন্য আপডেট করেছি now
চালক

সি উত্স ফাইলগুলির জন্য এই কনভেনশনটিও তৈরি করে: একটি নিউ-লাইন দিয়ে শেষ না হওয়া একটি খালি নয় এমন উত্স ফাইল যা অপরিবর্তিত আচরণ তৈরি করে।
আর ..

31

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

যদি আপনি স্ট্যান্ডার্ড ট্রেইলিং-নিউলাইন লাইনগুলির সাথে আন্তঃবিবাহিত শীর্ষস্থানীয়-নিউলাইন লাইনগুলি আউটপুট দেন তবে "এটি এর মতো দেখতে শেষ হবে:

Trailing-newline-line
Trailing-newline-line

Leading-newline-line
Leading-newline-line
Leading-newline-lineTrailing-newline-line
Trailing-newline-line

Leading-newline-lineTrailing-newline-line
Trailing-newline-line
Trailing-newline-line

... যা সম্ভবত আপনি চান তা নয়।

আপনি যদি আপনার কোডে কেবল শীর্ষস্থানীয় নিউলাইনগুলি ব্যবহার করেন এবং এটি কেবল একটি আইডিইতে চালান তবে এটি ঠিক আছে। আপনি এটি কোনও টার্মিনালে চালানোর সাথে সাথে বা অন্য লোকের কোডটি প্রবর্তন করবেন যা আপনার কোডের পাশাপাশি STDOUT এ লিখবে, আপনি উপরের মতো অনাকাঙ্ক্ষিত আউটপুট দেখতে পাবেন।


2
ইন্টারেক্টিভ শেলটিতে বিঘ্নিত প্রোগ্রামগুলির সাথে একই রকম কিছু ঘটে থাকে - যদি কোনও আংশিক লাইন মুদ্রিত হয় (এর নতুন লাইনটি অনুপস্থিত), তবে শেলটি বিভ্রান্ত হয়ে পড়েছে যে কার্সারটি কোন কলামটি চালু রয়েছে, পরবর্তী কমান্ড লাইনটি সম্পাদনা করা শক্ত করে তোলে। আপনি যদি আপনার একটি শীর্ষস্থানীয় নিউলাইন যোগ না করেন $PS1যা প্রচলিত প্রোগ্রামগুলির পরে একটি বিরক্তিকর হতে পারে।
টবি স্পিড

17

যেহেতু উচ্চ আপ-ভোট দেওয়া উত্তরগুলি ইতিমধ্যে চমত্কার প্রযুক্তিগত কারণ দিয়েছে কেন নতুন লাইনের পিছনে অগ্রাধিকার দেওয়া উচিত, তাই আমি এটিকে অন্য একটি কোণ থেকে কাছে নিয়ে যাব।

আমার মতে, নিম্নলিখিতগুলি একটি প্রোগ্রামকে আরও পাঠযোগ্য করে তোলে:

  1. একটি উচ্চ সিগন্যাল থেকে শব্দের অনুপাত (ওরফে সাধারণ তবে সহজ নয়)
  2. গুরুত্বপূর্ণ ধারণা প্রথম আসে

উপরোক্ত বিষয়গুলি থেকে, আমরা তর্ক করতে পারি যে পিছিয়ে পড়া নিউলাইনগুলি আরও ভাল। বার্তাটির সাথে তুলনা করার সময় নিউলাইনগুলি "গোলমাল" ফর্ম্যাট করছে, বার্তাটি প্রকাশিত হওয়া উচিত এবং এভাবে প্রথমে আসা উচিত (সিনট্যাক্স-হাইলাইটিংও সহায়তা করতে পারে)।


19
হ্যাঁ, "ok\n"তুলনায় অনেক ভালো "\nok"...
cmaster

@ মাস্টার: আমাকে সি-তে পাস্কাল-স্ট্রিং এপিআই ব্যবহার করে ম্যাকওএস সম্পর্কে পড়ার কথা মনে করিয়ে দেয়, যার জন্য ম্যাজিক এস্কেপ কোডের মতো সমস্ত স্ট্রিং লিটারেলগুলির উপসর্গের প্রয়োজন হয় "\pFoobar"
মাধ্যাকর্ষণ

16

ট্রেলিং নিউলাইনগুলি ব্যবহার করা পরে পরিবর্তনগুলি সহজতর করে।

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

আপনি যখন প্রথম পরীক্ষাটি চালাবেন এবং খুঁজে বের করুন "আরম্ভকরণ" এখন অন্য কোনও আউটপুটের একটি লাইনের শেষে যুক্ত হবে, আপনি কোডটি কোথায় এটি মুদ্রিত হয়েছে তা সন্ধান করতে হবে এবং তারপরে "ইনিশিয়ালিং" পরিবর্তন করতে হবে n n সূচনাকরণ "বিভিন্ন পরিস্থিতিতে, অন্য কোনও ফর্ম্যাটটিকে স্ক্রু করে না।

এখন বিবেচনা করুন যে কীভাবে আপনার নতুন আউটপুটটি আসলে optionচ্ছিক, তা হ্যান্ডেল করতে চলেছে, সুতরাং আপনার "n nInitializing" এ পরিবর্তন কখনও কখনও আউটপুট শুরুর সময় একটি অযাচিত ফাঁকা রেখা তৈরি করে ...

আপনি কি কোনও বিশ্বব্যাপী ( শক হরর ?? !!! ) পতাকা নির্ধারণ করেছেন যা পূর্ববর্তী কোনও আউটপুট ছিল কিনা এবং এটি একটি leadingচ্ছিক অগ্রণী "izing n" দিয়ে "ইনিশিয়ালিং" মুদ্রণের জন্য পরীক্ষা করে দেখেন, বা আপনি "\ n" এর সাথে আউটপুটও দেন? আপনার আগের আউটপুট এবং হতাশ কেন এই "আরম্ভ করা" ভবিষ্যতে কোড পাঠকদের ছেড়ে না একটি নেতৃস্থানীয় "\ N" সব অন্যান্য আউটপুট বার্তা পছন্দ করি না?

যদি আপনি ধারাবাহিকভাবে নতুন লাইনগুলি আউটপুট করে থাকেন, যেখানে আপনি জানেন যে আপনি যে লাইনের অবসান হওয়া দরকার তার শেষের দিকে পৌঁছেছেন, আপনি এই সমস্ত সমস্যাটিকে পাশ কাটাবেন। দ্রষ্টব্য, এর জন্য কিছু যুক্তি শেষে একটি পৃথক পুটস ("\ n") বিবৃতি প্রয়োজন হতে পারে যা লাইন টুকরো টুকরো করে ফেলেছে, তবে বিন্দুটি হল আপনি কোডটির প্রাথমিকতম স্থানে নিউলাইনটি আউটপুট আউটপুট দেবেন যেখানে আপনার জানা দরকার এটি অন্য কোথাও না।


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

7

প্রিন্টফের সাহায্যে অগ্রণীকরণের পরিবর্তে কেন নতুন নতুন লাইনের ব্যবহার?

ঘনিষ্ঠভাবে সি স্পেক মিল।

সি লাইব্রেরি একটি লাইনটিকে একটি নতুন-লাইন অক্ষরের সাথে শেষ হিসাবে সংজ্ঞায়িত করে । '\n'

একটি পাঠ্য স্ট্রিম হ'ল লাইনগুলিতে রচিত অক্ষরের ক্রমযুক্ত ক্রম , প্রতিটি লাইন শূন্য বা আরও বেশি অক্ষর সমেত একটি সমাপ্ত নতুন লাইনের অক্ষর। শেষ লাইনে একটি সমাপ্ত নতুন লাইনের চরিত্রের প্রয়োজন কিনা তা বাস্তবায়ন-সংজ্ঞায়িত। সি 11 §7.21.2 2

লাইন হিসাবে ডেটা লেখার কোডটি গ্রন্থাগারের সেই ধারণার সাথে মিলবে।

printf("Initializing"); // Write part of a line
printf("\nProcessing"); // Finish prior line & write part of a line
printf("\nExiting");    // Finish prior line & write an implementation-defined last line

printf("Initializing\n");//Write a line 
printf("Processing\n");  //Write a line
printf("Exiting");       //Write an implementation-defined last line

পুনরায়: শেষ লাইনে একটি সমাপ্ত নতুন লাইনের চরিত্রের প্রয়োজন । আমি সর্বদা '\n'আউটপুটটিতে একটি চূড়ান্ত লিখতে এবং ইনপুটটিতে এর অনুপস্থিতি সহ্য করার পরামর্শ দিই ।


বানান যাচাই করা

আমার বানান পরীক্ষক অভিযোগ করেন। সম্ভবত আপনারও।

  v---------v Not a valid word
"\nProcessing"

 v--------v OK
"Processing\n");

আমি এটির সাথে আরও ispell.elভালভাবে মোকাবিলা করতে একবার উন্নতি করেছি। আমি স্বীকার করি এটি প্রায়শই \tসমস্যা ছিল এবং এটি কেবল একাধিক টোকেনে স্ট্রিং ভেঙে এড়ানো যেতে পারে, তবে এটি এইচটিএমএলের অ-পাঠ্য অংশগুলি বেছে বেছে বাদ দেওয়া আরও সাধারণ "উপেক্ষা" কাজের একটি পার্শ্ব-প্রতিক্রিয়া ছিল বা MIME মাল্টিপার্ট বডি, এবং কোডের নন-মন্তব্য অংশ comment আমি সর্বদা বলতে চাইছি ভাষাগুলিতে স্যুইচিংয়ের ক্ষেত্রে এটি প্রসারিত করার জন্য যেখানে উপযুক্ত মেটাডেটা (যেমন <p lang="de_AT">বা Content-Language: gd) আছে, তবে কোনও রাউন্ড টিউট পাইনি। এবং রক্ষণাবেক্ষণকারী আমার প্যাচটি সরাসরি প্রত্যাখ্যান করেছিল। :-(
টবি স্পিড

@ টবিস্পাইট এখানে একটি বৃত্তাকার টাইট আছে । আপনার পুনরায় উন্নত করার চেষ্টা করার জন্য অপেক্ষা করুন ispell.el
chux

4

শীর্ষস্থানীয় নিউলাইনগুলি প্রায়শই শর্তযুক্ত থাকে যখন কোডটি লিখতে সহজ করে তোলে উদাহরণস্বরূপ,

printf("Initializing");
if (jobName != null)
    printf(": %s", jobName);
init();
printf("\nProcessing");

(তবে অন্য কোথাও উল্লেখ করা হয়েছে যে সিপিইউ সময় লাগে এমন কোনও পদক্ষেপ নেওয়ার আগে আপনাকে আউটপুট বাফারটি ফ্লাশ করতে হতে পারে))

সুতরাং এটি করার উভয় পদ্ধতির জন্য একটি ভাল কেস তৈরি করা যায়, তবে ব্যক্তিগতভাবে আমি প্রিন্টফ () পছন্দ করি না এবং আউটপুট তৈরির জন্য একটি কাস্টম ক্লাস ব্যবহার করব।


1
আপনি কী ব্যাখ্যা করতে পারবেন কেন এই সংস্করণটি পিছনে থাকা নতুন লাইনের সাথে লেখার চেয়ে সহজ? এই উদাহরণে এটি আমার কাছে স্পষ্ট নয়। পরিবর্তে আমি পরবর্তী আউটপুট হিসাবে একই লাইনে যুক্ত হওয়ায় সমস্যা দেখা দিতে পারে "\nProcessing"
রায়মুন্ড ক্রিমার

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

2
আমি নীতির সাথে একমত, তবে উদাহরণটি ভাল নয়। আরও প্রাসঙ্গিক উদাহরণ কোড সহ যা প্রতি লাইনে কিছু সংখ্যক আইটেম আউটপুট দেবে বলে ধারণা করা হচ্ছে। যদি আউটপুটটি একটি নতুন লাইন দিয়ে শেষ হয় এমন একটি শিরোলেখ দিয়ে শুরু হওয়ার কথা হয় এবং প্রতিটি লাইন শিরোনাম দিয়ে শুরু করার কথা হয়, তবে এটি বলা সহজ হতে পারে if ((addr & 0x0F)==0) printf("\n%08X:", addr);এবং ব্যবহারের চেয়ে নিঃশর্তভাবে আউটপুটটিতে একটি নতুন লাইন যুক্ত করা যায় প্রতিটি লাইনের শিরোলেখ এবং পিছনের নতুন লাইনের জন্য পৃথক কোড।
সুপারক্যাট

1

শীর্ষস্থানীয় নিউলাইনগুলি অন্যান্য লাইব্রেরির ফাংশনগুলির সাথে উল্লেখযোগ্যভাবে puts()এবং perrorস্ট্যান্ডার্ড লাইব্রেরিতে খুব ভাল কাজ করে না , তবে আপনি সম্ভবত ব্যবহার করতে পারেন এমন কোনও গ্রন্থাগার রয়েছে।

আপনি যদি প্রাক-লিখিত লাইনটি মুদ্রণ করতে চান (হয় ধ্রুবক, বা ইতিমধ্যে ফর্ম্যাট করা - উদাহরণস্বরূপ sprintf()), তবে puts()প্রাকৃতিক (এবং দক্ষ) পছন্দ। যাইহোক, puts()পূর্ববর্তী লাইনটি শেষ করার এবং একটি নির্বিঘ্নিত লাইন লেখার কোনও উপায় নেই - এটি সর্বদা লাইন টার্মিনেটরটি লিখে রাখে।

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