ডাবলসের জন্য স্ক্যানফের (") কেন"% এলএফ "দরকার হয়, যখন প্রিন্টফ () ঠিক"% এফ "দিয়ে ঠিক আছে?


179

এটা কেন হল scanf()প্রয়োজন lমধ্যে " %lf" যখন একটি পড়া double, যখন printf()ব্যবহার করতে পারেন " %f" নির্বিশেষে কিনা তার যুক্তি হল doubleবা float?

উদাহরণ কোড:

double d;
scanf("%lf", &d);
printf("%f", d);

1
আপনি এখানে পয়েন্টার বলতে কী বোঝাতে চাইছেন তা আমি বুঝতে পারি না। স্ক্যানফে আমরা কেবলমাত্র ও পরিবর্তনশীল (যেমন) ঠিকানাটি পাস করি তাই পয়েন্টারটি কোথায়

7
@ দেত্তঞ্চন্য সি-তে, আপনি যখন ইউনিারি &অপারেটরের সাথে একটি ভেরিয়েবলের "ঠিকানা" নেন, তখন সেই ক্রিয়াকলাপের ফলাফল স্মৃতিতে ভেরিয়েবলের সঞ্চয় স্থানের দিকে নির্দেশক ter এটি যে পয়েন্টারটি পাস করা হয় scanf
zwol

এই হল একটি এই সংক্রান্ত অন্য একটা পোস্টে stackoverflow.com/questions/9291348/...
vimalpt

উত্তর:


207

কারণ সি ভেরিয়েবল আর্গুমেন্ট গ্রহণ করে এমন ফাংশনগুলির জন্য ফ্লোটসকে ডাবলসে উন্নীত করবে। পয়েন্টার কিছু উন্নীত করা, তাই আপনি ব্যবহার হওয়া উচিত %lf, %lgবা %le(অথবা %laC99 মধ্যে) ডাবলস পড়া।


26

С99 যেহেতু সি বিন্যাস নির্দিষ্টকরী এবং ভাসমান দফা আর্গুমেন্ট প্রকার মধ্যে ম্যাচিং মধ্যে সামঞ্জস্যপূর্ণ printfএবং scanf। এইটা

  • %f জন্য float
  • %lf জন্য double
  • %Lf জন্য long double

এটি ঠিক তাই ঘটে যখন টাইপের আর্গুমেন্টগুলি floatভ্যারিয়েডিক পরামিতি হিসাবে পাস করা হয়, তখন এই জাতীয় যুক্তিগুলি স্পষ্টভাবে টাইপে রূপান্তরিত হয় double। এই কারণে যে কেন printfবিন্যাস নির্দিষ্টকরী %fএবং %lfসমতুল্য এবং বিনিমেয় হয়। ইন printfআপনি "ক্রস-ব্যবহার" করতে পারেন %lfসঙ্গে floatবা %fসঙ্গে double

বাস্তবে বাস্তবে এটি করার কোনও কারণ নেই। ব্যবহার করবেন না %fকরতে printfটাইপ অফ আর্গুমেন্ট double। এটি C89 / 90 বারে ফিরে জন্মগ্রহণ করা একটি বিস্তৃত অভ্যাস, তবে এটি একটি খারাপ অভ্যাস। ব্যবহারের %lfমধ্যে printfজন্য doubleএবং Keep %fজন্য সংরক্ষিত floatআর্গুমেন্ট।


1
আমি বলব যে %fপ্রিন্টফে ব্যবহার করা একটি ভাল অভ্যাস কারণ তারপরে আপনার কোডটি সর্বদা কার্যকর হয়, অন্যদিকে %lfসংকলকটির যদি C99 অনুমানযোগ্য লাইব্রেরি না থাকে তবে ব্যবহার করা ব্যর্থ হতে পারে। দুর্ভাগ্যক্রমে পরিস্থিতি বাস্তবে ঘটে।
এমএম

С99 যেহেতু সি বিন্যাস নির্দিষ্টকরী এবং ভাসমান দফা আর্গুমেন্ট প্রকার মধ্যে ম্যাচিং মধ্যে সামঞ্জস্যপূর্ণ printfএবং scanf নোট করুন যে এটি বোঝায় না যে একই ফর্ম্যাট স্পেসিফায়ার ব্যবহারের অর্থ হ'ল একটি দ্বারা লিখিত ডেটা [f]printf()পড়া যায় [f]scanf()। সাধারণভাবে, একই বিন্যাসে সুনির্দিষ্টভাবে উল্লেখ করা ব্যবহার করার জন্য scanf()যে ব্যবহার করত printf()হবে না সফলভাবে ডেটা পড়তে। উদাহরণস্বরূপ, স্পেস প্যাডিং যা কোনও prinf()' "%d"বিন্যাস নির্দিষ্টকরণকারীর দ্বারা সন্নিবেশ করা যায় that কলটিতে একই "%d"ফর্ম্যাট স্পেসিফায়ার দ্বারা এড়ানো হবে scanf()
অ্যান্ড্রু হেনেল

16

scanf&dএটিকে সঠিকভাবে পূরণ করার জন্য যে আকারের প্রতি নির্দেশ করা হচ্ছে সেটির আকারটি জানতে হবে, যেখানে বৈচিত্র্যমূলক ফাংশনগুলি ভাসমানগুলি দ্বৈতকে উন্নীত করে (কেন পুরোপুরি নিশ্চিত নয়), তাই printfসর্বদা একটি হয় double


1
একটি বৈকল্পিক ফাংশন খুব ভঙ্গুর, কারণ এটিতে যে সমস্ত পরামিতিগুলি দেওয়া হয়েছে তার সঠিক ধরণ এবং আকার জানতে সক্ষম হওয়া প্রয়োজন এবং এটি সংকলনের সময় এটি প্রয়োগ করতে পারে না। যদি কোনও ভেরিয়েবলটি ভুল টাইপ হয় তবে ভুল মানটি পড়বে; যদি এটির আকারটি ভুল হয় তবে এর পরে সমস্ত ভেরিয়েবলগুলিও ভুলভাবে পড়ে। যদি দুটি ভিন্ন আকারের ফ্লোটটি পাস করা যায়, তবে এটি সমস্ত ধরণের বাজে এবং সহজেই সহজেই মিস করতে পারে।
mwfearnley

7

কারণ অন্যথায় স্ক্যানফ ভাববে আপনি কোনও ফ্লোটের দিকে একটি পয়েন্টারটি যাচ্ছেন যা দ্বিগুণের চেয়ে ছোট আকারের এবং এটি একটি ভুল মান প্রদান করবে।


2

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


5
ভাসা একটি ডবল রূপান্তরিত হয় এই ক্ষেত্রে কারণ আর্গুমেন্ট একটি পরিবর্তনশীল দৈর্ঘ্যের আর্গুমেন্ট তালিকার অংশ, ভাসে সবসময় ডাবলস সি রূপান্তরিত করা হয় না
রবার্ট জুয়া

1
সি-ভাষা সংস্করণের প্রাক-মান সংস্করণগুলিতে floatস্বয়ংক্রিয়ভাবে doubleএক্সপ্রেশনগুলিতে প্রচারিত হয়েছিল । এই নিয়মটি সি স্ট্যান্ডার্ড সিতে পরিত্যাগ করা হয়েছিল সাধারণত, প্রকাশের ক্ষেত্রে floatপ্রচার করা হয় doubleনা। এটি কেবলমাত্র doubleবৈকল্পিক যুক্তি হিসাবে পাস করার সময় উন্নীত হয় , যা এই ক্ষেত্রে ঘটে।
এএনটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.