স্ক্যানফ () বাফারে নতুন লাইন চর ছেড়ে দেয়


92

আমি নিম্নলিখিত প্রোগ্রাম আছে:

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

এটা কি সঠিক?

তবে, এটি কি কেবল charডেটা টাইপের সাথে ঘটে ? যেহেতু আমি int1, 2, 3 লাইনের মতো তথ্য প্রকারের সাথে এই সমস্যাটি দেখিনি it এটা কি ঠিক?


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

আপনি দয়া করে কোন বইটি উল্লেখ করছেন তা আমাদের জানান?
সুর্য কিরণ

উত্তর:


81

scanf()ফাংশন ছেড়ে যাওয়া স্বয়ংক্রিয়ভাবে নেতৃস্থানীয় হোয়াইটস্পেস অক্ষর ছাড়া অন্য ধর্মান্তর বিশ্লেষণ করতে চেষ্টা করার আগে। অক্ষর বিন্যাস (প্রাথমিকভাবে %c; এছাড়াও স্ক্যান সেট %[…]- এবং %n) ব্যতিক্রম; তারা সাদা স্থান ছেড়ে যায় না।

" %c"Whiteচ্ছিক সাদা স্থান এড়াতে একটি নেতৃস্থানীয় ফাঁকা দিয়ে ব্যবহার করুন । scanf()বিন্যাসের স্ট্রিংয়ে ট্রেলিং ফাঁকা ব্যবহার করবেন না ।

লক্ষ্য করুন এই এখনও কোনো চিহ্ন হোয়াইটস্পেস ইনপুট স্ট্রিম বাকি গ্রাস করে না, এমনকি একটি লাইন শেষে, যাতে হুঁশিয়ার যদি ব্যবহার getchar()বা fgets()একই ইনপুট স্ট্রিম উপর। রূপান্তরকরণের আগে আমরা কেবল সাদা স্থানের এড়াতে স্ক্যানফ পেয়ে যাচ্ছি , যেমন এটি %dঅন্যান্য চরিত্রহীন রূপান্তরগুলির জন্য করে।


মনে রাখবেন যে রূপান্তর ব্যতীত শ্বেতস্পেসবিহীন "নির্দেশাবলী" ( POSIX স্ক্যানফ পরিভাষা ব্যবহার করতে ) যেমন আক্ষরিক পাঠ্যটি scanf("order = %d", &order);হোয়াইটস্পেস এড়িয়ে যায় না। আক্ষরিক orderপড়তে পড়তে পরবর্তী চরিত্রটি মেলে।

সুতরাং আপনি সম্ভবত " order = %d"সেখানে চান যদি আপনি পূর্ববর্তী লাইন থেকে একটি নতুন লাইন ছেড়ে যেতে চান তবে এখনও এই প্রশ্নের মতো একটি নির্দিষ্ট স্ট্রিংয়ের উপর আক্ষরিক মিল প্রয়োজন ।


9
%c, %n, %[]3 নির্দিষ্ট প্রত্যাশা যে নেতৃস্থানীয় হোয়াইটস্পেস গ্রাস না।
chux - 3

@ চাক্স অন্যান্য ক্ষেত্রেও কি তাই, স্ক্যানফ বাফারে আগে সমস্ত সাদা জায়গা স্পেস করে বা তাদের ইনপুট দেওয়ার জন্য এড়িয়ে চলে তবে তারা এখনও আছে?
সুরজ জৈন


4
দেখুন খালি শেষের scanf()ফরম্যাট স্ট্রিং এবং scanf()ইনপুট জন্য দুইবার জিজ্ঞাসা যখন আমি এটা শুধুমাত্র একবার জিজ্ঞাসা করতে আশা বিন্যাস স্ট্রিং মধ্যে ঐ খালি trailing আলোচনার জন্য। এগুলি একটি খারাপ ধারণা - আপনি যদি মানুষের ইন্টারঅ্যাকশন এবং প্রোগ্রামের মিথস্ক্রিয়াটির জন্য খারাপের প্রত্যাশা করেন তবে আশ্চর্যরকম খারাপ।
জোনাথন লেফলার


8

আরেকটি বিকল্প (যে আমি থেকে পেয়েছেন এখানে ) পড়া এবং ব্যবহার করার মাধ্যমে সম্পর্কে newline বাতিল করতে হয় কার্যভার supression বিকল্প । এটি করার জন্য, আমরা কেবল একটি %এবং একটি তারকাচিহ্ন সহ একটি অক্ষর পড়ার জন্য একটি ফর্ম্যাট রেখেছি c:

scanf তারপরে পরবর্তী চরটি পড়বে (এটি, নতুন লাইন) তবে এটি কোনও পয়েন্টারের জন্য বরাদ্দ করবে না।

তবে শেষ পর্যন্ত আমি FAQ এর শেষ বিকল্পটিকে দ্বিতীয় করে দেব :

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


4
এই কৌশলটির সমস্যাটি হ'ল যদি ব্যবহারকারী টাইপ করে থাকে aতবে স্পেসের পরে নিউলাইন, চাপা অক্ষরের রূপান্তরটি স্পেসটি পড়ে এবং তবুও নিউলাইনটি ছেড়ে যায়। আপনি supercalifragilisticexpialidociousযখন প্রত্যাশার সময় ব্যবহারকারী টাইপ করেন a, আপনার সাথে ডিল করার জন্য প্রচুর অতিরিক্ত চরিত্র রয়েছে। কোনও পিছনে দমন করা রূপান্তর সফল হয় কিনা তা আপনি কখনই বলতে পারবেন না - সেগুলি এর থেকে প্রাপ্ত হিসাবে গণনা করা হয় না scanf()
জোনাথন লেফলার

4

getchar()দ্বিতীয় কল করার আগে ব্যবহার করুন scanf()


4
উদাহরণস্বরূপ, ফাঁকা স্থান অনুসরণ করে - ব্যবহারকারী অন্য কোনও কিছু টাইপ না করে এমনটি সরবরাহ করে works তবে এটি এমন লুপের মতো ততটা ভাল নয় যা পরের নতুন int c; while ((c = getchar()) != EOF && c != '\n') ;লাইনে স্ক্যান করে: (কোনও মন্তব্যে না থাকলে তিনটি লাইনের উপরে লেখা)। এটি প্রায়শই যথেষ্ট; এটি নির্বোধ নয় (এবং আপনার মনে রাখতে হবে যে বোকারা জিনিস ক্র্যাশ করার বিষয়ে খুব চালাক)।
জোনাথন লেফলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.