প্রিন্টফ - বাগের উত্স? [বন্ধ]


9

আমি আমার printfকোডটিতে ট্রেসিং / লগিংয়ের উদ্দেশ্যে প্রচুর ব্যবহার করছি , আমি খুঁজে পেয়েছি এটি প্রোগ্রামিং ত্রুটির একটি উত্স। আমি সর্বদা সন্নিবেশ অপারেটরটিকে ( <<) কিছুটা অদ্ভুত জিনিস বলে মনে করেছি তবে আমি এটি ভাবতে শুরু করেছি যে পরিবর্তে এটি ব্যবহার করে আমি এই বাগগুলি থেকে কিছু এড়াতে পারি।

কারওর সাথে কি কখনও একইরকম উদ্ঘাটন ঘটেছিল বা আমি এখানে খড়কে আঁকড়ে ধরছি?

কিছু পয়েন্ট দূরে নিতে

  • আমার বর্তমানের চিন্তাভাবনাটি হ'ল টাইপ-সুরক্ষা প্রিন্টফ ব্যবহারের কোনও উপকারকে ছাড়িয়ে যায়। আসল সমস্যা হ'ল ফর্ম্যাট স্ট্রিং এবং নন-টাইপ-সেফ ভেরিয়্যাডিক ফাংশনগুলির ব্যবহার।
  • সম্ভবত আমি ব্যবহার করব না <<এবং স্টাইল আউটপুট স্ট্রিমের রূপগুলি খুঁজে পাব তবে আমি অবশ্যই একটি টাইপ-নিরাপদ প্রক্রিয়া ব্যবহার করব যা খুব অনুরূপ।
  • অনেকগুলি ট্রেসিং / লগিং শর্তযুক্ত তবে আমি পরীক্ষাগুলিতে বাগগুলি মিস না করার জন্য কোডটি সর্বদা চালাতে চাই কারণ এটি খুব কমই নেওয়া শাখা।

4
printfসি ++ বিশ্বে? আমি এখানে কিছু মিস করছি?
ব্যবহারকারী 827992

10
@ ব্যবহারকারী 827992: আপনি কি সিটি ++ স্ট্যান্ডার্ডটিতে রেফারেন্স সহ সি স্ট্যান্ডার্ড লাইব্রেরিটি অন্তর্ভুক্ত করছেন তা মিস করছেন? এটি printfসি ++ এ ব্যবহার করা পুরোপুরি আইনী । (এটি একটি ভাল ধারণা কিনা তা অন্য প্রশ্ন))
কিথ থমসন

2
@ ব্যবহারকারী 827992: এর printfকিছু সুবিধা রয়েছে; আমার উত্তর দেখুন।
কিথ থম্পসন

1
এই প্রশ্নটি বেশ সীমান্তরেখা। "আপনারা কি মনে করেন" প্রশ্নগুলি প্রায়শই বন্ধ থাকে।
dbracey

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

উত্তর:


2

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

হ্যাঁ, আমাদের আউটপুটটির ফর্ম্যাটটি বের করার জন্য, এমন কিছু যা সংকলনের সময় আমরা 100% জানতে পারি, আসুন অনির্বচনীয় ফর্ম্যাট কোডগুলি ব্যবহার করে প্রচুর অদ্ভুত জাম্প টেবিলের অভ্যন্তরে রানটাইমের সময় একটি ফ্রিকেন ফর্ম্যাট স্ট্রিংটি পার্স করুন!

অবশ্যই এই ফর্ম্যাট কোডগুলি তাদের প্রতিনিধিত্বকারী ধরণের সাথে মেলে তৈরি করা যায়নি, এটি খুব সহজ ... এবং আপনি যখনই প্রতিবার অনুসন্ধান করবেন তখন মনে করিয়ে দেওয়া হবে যে এটি% llg বা% lg এই (দৃ strongly়ভাবে টাইপ করা) ভাষা আপনাকে তৈরি করে কিনা কিছু মুদ্রণ / স্ক্যান করার জন্য ম্যানুয়ালি প্রকারগুলি বের করুন এবং এন্ড -32 বিট প্রসেসরের জন্য নকশা করা হয়েছিল।

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

(আপনি যদি স্ট্যান্ডার্ড পাত্রে std::cout << my_list << "\n";মোটামুটি ব্যবহার করেন তবে নিজেকে কিছু দ্রুত টেম্পলেটড অপারেটর লিখুন << ওভারলোড যা আপনাকে ডিবাগের মতো জিনিস করতে দেয় , যেখানে মাই_লিস্টটি টাইপ হয় list<vector<pair<int,string> > >))


1
স্ট্যান্ডার্ড সি ++ গ্রন্থাগারের সমস্যা হ'ল, বেশিরভাগ অবতারগুলি operator<<(ostream&, T)কল করে কার্যকর করে ... ভাল sprintf,! এর পারফরম্যান্সটি sprintfঅনুকূল নয়, তবে এর কারণে, আইওস্ট্রিমের পারফরম্যান্স সাধারণত আরও খারাপ is
জান হুডেক

@ জানহুদেক: এই মুহূর্তে প্রায় এক দশক ধরে এটি সত্য হয়নি। প্রকৃত মুদ্রণটি একই অন্তর্নিহিত সিস্টেম কলগুলির সাথে সম্পন্ন হয় এবং সি ++ বাস্তবায়নগুলি প্রায়শই সি লাইব্রেরিতে কল করে ... তবে প্রিন্টফের মাধ্যমে স্টাড :: সিউটের রাউটিংয়ের মতো জিনিস নয়।
জাকারিয়ান

16

সি স্টাইল printf()(বা puts()বা putchar()...) আউটপুট সি ++ - স্টাইল std::cout << ...আউটপুট মিশ্রিত করা অনিরাপদ হতে পারে। আমি যদি সঠিকভাবে স্মরণ করি তবে তাদের পৃথক বাফারিং প্রক্রিয়া থাকতে পারে, সুতরাং আউটপুটটি সম্ভবত আদেশিতভাবে প্রদর্শিত নাও হতে পারে। (যেমন এপ্রোগ্রামার একটি মন্তব্যে উল্লেখ করেছেন, sync_with_stdioএটিকে সম্বোধন করেছেন)।

printf()মূলত টাইপ-অনিরাপদ। আর্গুমেন্টের জন্য প্রত্যাশিত প্রকারটি ফর্ম্যাট স্ট্রিং দ্বারা নির্ধারিত হয় ( "%d"এমন একটি intবা এমন কিছু প্রয়োজন যা প্রচার করে int, "%s"এমন একটি প্রয়োজন char*যা সঠিকভাবে বন্ধ হওয়া সি-স্টাইলের স্ট্রিং ইত্যাদির দিকে নির্দেশ করতে পারে), তবে ভুল প্রকারের যুক্তিটি অপ্রকাশিত আচরণের ফলে পাস করা হয় , ডায়াগোনসযোগ্য ত্রুটি নয়। কিছু সংকলক, যেমন জিসিসি, প্রকারের মিলগুলি সম্পর্কে সতর্ক করার পক্ষে যুক্তিসঙ্গতভাবে ভাল কাজ করে তবে ফর্ম্যাট স্ট্রিংটি আক্ষরিক বা অন্যথায় সংকলন সময়ে (যা সর্বাধিক সাধারণ ঘটনাটি হয়) হিসাবে পরিচিত হয় তবেই তারা এটি করতে পারে - এবং এই জাতীয় সতর্কবার্তা ভাষা দ্বারা প্রয়োজন হয় না। আপনি যদি ভুল ধরণের তর্কটি পাস করেন তবে ইচ্ছামত খারাপ জিনিস ঘটতে পারে।

অপরদিকে সি ++ এর স্ট্রিম I / O, অনেক বেশি টাইপ-নিরাপদ, যেহেতু <<অপারেটরটি বিভিন্ন ধরণের জন্য ওভারলোড হয়। std::cout << xএর ধরণ নির্দিষ্ট করতে হবে না x; সংকলক যেকোন প্রকারের জন্য সঠিক কোড উত্পন্ন করবে x

অন্যদিকে, printfফর্ম্যাটিং বিকল্পগুলি IMHO অনেক বেশি সুবিধাজনক। দশমিক পয়েন্টের পরে যদি আমি 3 সংখ্যার সাথে ভাসমান-পয়েন্ট মানটি মুদ্রণ করতে চাই তবে আমি ব্যবহার করতে পারি "%.3f"- এবং একই printfকলের মধ্যেও এটি অন্যান্য আর্গুমেন্টগুলিতে কোনও প্রভাব ফেলবে না । setprecisionঅন্যদিকে, সি ++ এর স্ট্রিমের অবস্থা প্রভাবিত করে এবং যদি আপনি স্ট্রিমটিকে আগের অবস্থাতে পুনরুদ্ধার করতে খুব সচেতন না হন তবে পরে আউটপুট জগাখিচুড়ি করতে পারে। (এটি আমার ব্যক্তিগত পোষ্যের উঁকি; এটি এড়াতে যদি আমি কোনও পরিষ্কার উপায় মিস করি তবে মন্তব্য করুন।)

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

এটা সম্ভবত ব্যবহার করা সর্বোত্তম std::cout << ...অন্যান্য সি ++ প্রোগ্রামারদের আপনার কোডের উপর কাজ করতে পারে অনুরোধে জন্য, কিন্তু আপনি হয় এক ব্যবহার করতে পারেন - বিশেষত ট্রেস কোডে যে আপনার বর্জন করা যাচ্ছি।

এবং অবশ্যই এটি ডিবাগারগুলি কীভাবে ব্যবহার করতে হয় তা শেখার জন্য কিছুটা সময় ব্যয় করার উপযুক্ত (তবে এটি সম্ভবত কিছু পরিবেশে সম্ভব নয়)।


মূল প্রশ্নে মেশার কোনও উল্লেখ নেই।
dbracey

1
@ ডাব্রাসি: না, তবে আমি ভেবেছিলাম এটির সম্ভাব্য অপূর্ণতা হিসাবে এটি উল্লেখযোগ্য printf
কিথ থম্পসন

6
সিঙ্ক্রোনাইজেশন ইস্যুটির জন্য দেখুন std::ios_base::sync_with_stdio
এপ্রোগ্রামার

1
মাল্টিথ্রেডেড অ্যাপে ডিবাগ তথ্য প্রিন্ট করতে std :: cout ব্যবহার করা 100% অকেজো। কমপক্ষে প্রিন্টফের সাথে জিনিসগুলি মানুষ বা মেশিন দ্বারা আন্তঃবাহিত এবং অপসারণযোগ্য হওয়ার সম্ভাবনা নেই।
জেমস

@ জেমস: এটি কি std::coutমুদ্রিত প্রতিটি আইটেমের জন্য একটি পৃথক কল ব্যবহার করে? আপনি এটি চারপাশে কাজ করতে পারে এটি মুদ্রণের আগে একটি স্ট্রিংয়ের আউটপুট একটি লাইন সংগ্রহ করে। এবং অবশ্যই আপনি সাথে একবারে একটি আইটেম মুদ্রণ করতে পারে printf; এটি একটি কলে একটি লাইন (বা আরও) মুদ্রণ করা আরও বেশি সুবিধাজনক।
কিথ থম্পসন

2

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

printf("%d", SomeObject);

যেখানে <<হবে না।

দ্রষ্টব্য: ডিবাগিংয়ের জন্য, আপনি ব্যবহার করেন না printfবা cout। আপনি fprintf(stderr, ...)এবং ব্যবহার cerr


মূল প্রশ্নে মেশার কোনও উল্লেখ নেই।
dbracey

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

@ জনলিডগ্রেন: তবে যদি SomeObjectপয়েন্টার না হয় তবে কী হবে ? আপনার অনিয়ন্ত্রিত বাইনারি ডেটা পেতে চলেছেন যা সংকলক সিদ্ধান্ত নেয় তা উপস্থাপন করে SomeObject
লিনিকোসিজ

আমি মনে করি আমি আপনার উত্তরটি পিছনে পড়েছি ... এনভিএম।
জন লিডেগ্রেন

1

অনেকগুলি গ্রুপ রয়েছে - উদাহরণস্বরূপ গুগল - যা স্ট্রিম পছন্দ করে না।

http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Streams

(পপটি ত্রিভুজের জিনিসটি খুলুন যাতে আপনি আলোচনাটি দেখতে পারেন)) আমি মনে করি গুগল সি ++ স্টাইল গাইডটিতে প্রচুর সংবেদনশীল পরামর্শ রয়েছে।

আমি মনে করি ট্রেড অফটি হ'ল স্ট্রিমগুলি নিরাপদ তবে প্রিন্টফটি পড়ার জন্য আরও পরিষ্কার (এবং আপনার পছন্দ মতো ফর্ম্যাটটি পাওয়া সহজ)।


2
গুগল স্টাইল গাইডটি দুর্দান্ত, তবে এতে বেশ কয়েকটি আইটেম রয়েছে যা সাধারণ উদ্দেশ্যে গাইডের জন্য উপযুক্ত নয় । (যা ঠিক আছে, কারণ সর্বোপরি গুগলের / / এ কোড চলার জন্য এটি গুগলের গাইড ))
মার্টিন বা

1

printfধরণের সুরক্ষার অভাবে বাগগুলি দেখা দিতে পারে। iostreamএর <<অপারেটর এবং আরও জটিল বিন্যাসে স্যুইচ না করে সম্বোধনের কয়েকটি উপায় রয়েছে :

  • কিছু সংকলক (যেমন জিসিসি এবং ক্ল্যাং) আর্গুমেন্টের printfবিরুদ্ধে আপনার ফর্ম্যাট স্ট্রিংগুলি optionচ্ছিকভাবে পরীক্ষা করতে printfপারে এবং যদি তারা মেলে না তবে নিম্নলিখিতগুলির মতো সতর্কতা প্রদর্শন করতে পারে।
    সতর্কতা: রূপান্তরটি 'int' টাইপ নির্দিষ্ট করে কিন্তু যুক্তিতে 'চর *' টাইপ রয়েছে
  • Typesafeprintf স্ক্রিপ্টটি আপনার preprocess করতে printfতাদের টাইপ-নিরাপদ করতে -style কল।
  • 'টাইপ সুরক্ষা এবং টাইপ এক্সটেনসিবিলিটি বজায় রেখে বুস্ট.ফর্ম্যাট এবং ফাস্টফর্ম্যাট এর মতো লাইব্রেরিগুলিতে আপনাকে পছন্দ printfমতো ফর্ম্যাট স্ট্রিংগুলি (বুস্ট.ফর্ম্যাট বিশেষত প্রায় অনুরূপ printf) ব্যবহার করতে দেয় iostreams

1

প্রিন্টফ সিনট্যাক্সটি মূলত ভাল, কিছু অস্পষ্ট টাইপিংয়ের বিয়োগফল। আপনি যদি মনে করেন যে এটি ভুল, কেন সি #, পাইথন এবং অন্যান্য ভাষাগুলি খুব অনুরূপ নির্মাণ ব্যবহার করে? সি বা সি ++ এর সমস্যা: এটি কোনও ভাষার অংশ নয় এবং সুতরাং সঠিক বাক্য গঠন (*) এর জন্য সংকলক দ্বারা পরীক্ষা করা হয়নি এবং গতির জন্য অনুকূলিত হলে দেশীয় কলগুলির সিরিজে বিভক্ত নয়। নোট করুন যে আকারের জন্য অনুকূলকরণ করা হলে, প্রিন্টফ কলগুলি আরও দক্ষ হয়ে উঠতে পারে! সি ++ স্ট্রিমিং সিনট্যাক্স হ'ল ভাল তবে ভাল। এটি কাজ করে, টাইপ-সেফটি রয়েছে তবে ভারবজ সিনট্যাক্স ... ব্লাহ। মানে আমি এটি ব্যবহার করি তবে কোনও আনন্দের সাথে নয়।

(*) কিছু সংকলক এই চেকিং প্লাস প্রায় সমস্ত স্থিতিশীল বিশ্লেষণ সরঞ্জাম করেন (আমি লিন্ট ব্যবহার করি এবং প্রিন্টফের সাথে আর কখনও সমস্যা হয়নি)।


1
নেই Boost.Format যে সুবিধাজনক সিনট্যাক্স (সম্মিলন format("fmt") % arg1 % arg2 ...;টাইপ-নিরাপত্তা সহ)। আরও কিছু কার্য সম্পাদনের জন্য, কারণ এটি স্ট্রিংস্ট্রিম কলগুলি উত্পন্ন করে যা অভ্যন্তরীণভাবে অনেকগুলি প্রয়োগে স্প্রিন্টফ কল উত্পন্ন করে।
জান হুডেক

0

printf, আমার নিজের মতামত, সিপিপি স্ট্রিম আউটপুটগুলির তুলনায় ভেরিয়েবলগুলি মোকাবেলার জন্য একটি আরও নমনীয় আউটপুট সরঞ্জাম। উদাহরণ স্বরূপ:

printf ( "%d in ANSI = %c\n", j, j ); /* Perfectly valid... if a char ISN'T printing right, I'd just check the integer value to make sure it was okay. */

তবে, আপনি যেখানে সিপিপি <<অপারেটরটি ব্যবহার করতে চাইতে পারেন তা যখন আপনি কোনও নির্দিষ্ট পদ্ধতির জন্য ওভারলোড করেন ... উদাহরণস্বরূপ কোনও নির্দিষ্ট ব্যক্তির ডেটা ধারণ করে এমন কোনও বস্তুর ডাম্প পাওয়া, PersonData....

ostream &operator<<(ostream &stream, PersonData obj)
{
 stream << "\nName: " << name << endl;
 stream << " Number: " << phoneNumber << endl;
 stream << " Age: " << age << endl;
 return stream;
}

তার জন্য, এটি বলা আরও কার্যকর হবে (ধরে aনেওয়া পার্সনডাটার কোনও বস্তু)

std::cout << a;

চেয়ে:

printf ( "Name: %s\n Number: %s\n Age: %d\n", a.name, a.number, a.age );

প্রাক্তনটি এনক্যাপসুলেশন নীতিটির সাথে অনেক বেশি সারণিযুক্ত (নির্দিষ্টকরণগুলি, ব্যক্তিগত সদস্যের ভেরিয়েবলগুলি জানার দরকার নেই), এবং এটি পড়া সহজ।


0

আপনার printfসি ++ ব্যবহার করার কথা নয় । কখনো। কারণটি যেমন আপনি সঠিকভাবে উল্লেখ করেছেন যে এটি একটি বাগের উত্স এবং কাস্টম প্রকারের মুদ্রণ, এবং সি ++ এ প্রায় প্রতিটি জিনিসই কাস্টম ধরণের হওয়া উচিত pain সি ++ সমাধান হ'ল স্ট্রিম।

তবে একটি জটিল সমস্যা রয়েছে যা স্ট্রিমগুলিকে কোনও এবং ব্যবহারকারীর দ্বারা দৃশ্যমান আউটপুট জন্য অনুপযুক্ত করে তোলে! সমস্যা অনুবাদ। গেটেক্সট ম্যানুয়াল থেকে উদাহরণ গ্রহণের ফলে আপনি লিখতে চান:

cout << "String '" << str << "' has " << str.size() << " characters\n";

এখন জার্মান অনুবাদক এসেছেন এবং বলেছেন: ঠিক আছে, জার্মান ভাষায়, বার্তাটি হওয়া উচিত

এন Zeichen ল্যাঙ IST মরা Zeichenkette ' গুলি '

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

printf("%2$d Zeichen lang ist die Zeichenkette '%1$s'", ...);

Boost.Format সমর্থন printf-শৈলী বিন্যাস ও এই বৈশিষ্ট্যটি হয়েছে। সুতরাং আপনি লিখুন:

cout << format("String '%1' has %2 characters\n") % str % str.size();

দুর্ভাগ্যক্রমে এটি কিছুটা পারফরম্যান্স পেনাল্টি বহন করে, কারণ অভ্যন্তরীণভাবে এটি একটি স্ট্রিং স্ট্রিম তৈরি করে এবং <<অপারেটরটিকে প্রতিটি বিট ফর্ম্যাট করতে ব্যবহার করে এবং অনেকগুলি প্রয়োগে <<অপারেটর অভ্যন্তরীণ কল করে sprintf। আমি সন্দেহ করি যদি সত্যিই ইচ্ছা হয় তবে আরও দক্ষ বাস্তবায়ন সম্ভব হবে।


-1

আপনি stlঅশুভ বা না এই সত্যের পাশে আপনি প্রচুর অকেজো কাজ করছেন , কেবলমাত্র আরও 1 টি স্তরের সম্ভাব্য ব্যর্থতার একটি সিরিজ দিয়ে আপনার কোডটি ডিবাগ করুন printf

কেবল একটি ডিবাগার ব্যবহার করুন এবং ব্যতিক্রম এবং কীভাবে সেগুলি ধরা এবং নিক্ষেপ করা যায় সে সম্পর্কে কিছু পড়ুন; আপনার প্রকৃতপক্ষে যতটা প্রয়োজন তার চেয়ে বেশি ভার্বোজ না হওয়ার চেষ্টা করুন।

পুনশ্চ

printf সিতে ব্যবহার করা হয়, আপনার কাছে থাকা সি ++ এর জন্য std::cout


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