প্রিন্টফের অর্থ "%। * S" কি?


উত্তর:


120

আপনি বিন্যাস স্ট্রিংয়ে হার্ড কোডিংয়ের চেয়ে *প্রস্থের স্পেসিফায়ার / স্পষ্টতাটি পাস করতে একটি অ্যাসিরিস্ক ( ) ব্যবহার করতে পারেনprintf()

void f(const char *str, int str_len)
{
  printf("%.*s\n", str_len, str);
}

4
এটি লক্ষ করা উচিত যে str_lenআর্গুমেন্টের টাইপ থাকতে হবে int(বা সংকীর্ণ ইন্টিগ্রাল টাইপ, যা উন্নীত হবে int)। এটি পাস একটি বাগ হবে long, size_tইত্যাদি,
এম এম

10
এটি উল্লেখযোগ্য যে এই কোডটির সম্ভাব্য উদ্দেশ্যটি বিশেষত যখন ব্যবহৃত হয় তখন %sমূল স্ট্রিংয়ের একটি সাব-স্ট্রিং মুদ্রণ করা। এই ব্যবহারের ক্ষেত্রে, strমূল স্ট্রিংয়ের ভিতরে (সম্ভবত শুরুতে) কোথাও নির্দেশ str_lenকরবে এবং প্রিন্ট করা উচিত এমন সাব-স্ট্রিংয়ের দৈর্ঘ্য নির্দিষ্ট করবে।
সোনিক এটম

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

23

আরো বিস্তারিত এখানে

পূর্ণসংখ্যা মান বা *এটি ন্যূনতম ক্ষেত্রের প্রস্থ নির্দিষ্ট করে। ফলাফলটি স্থানের অক্ষরগুলি (ডিফল্টরূপে) দিয়ে প্যাড করা হয়, যদি প্রয়োজন হয়, বামদিকে ডান-ন্যায়সঙ্গত যখন বা ডানদিকে বাম-ন্যায়সঙ্গত হয়। ক্ষেত্রে যখন * ব্যবহৃত হয়, প্রস্থটি টাইপ int এর অতিরিক্ত যুক্তির দ্বারা নির্দিষ্ট করা হয়। যদি আর্গুমেন্টের মানটি নেতিবাচক হয় তবে এটি - পতাকা নির্দিষ্ট এবং ধনাত্মক ক্ষেত্রের প্রস্থের সাথে ফলাফল দেয়। (দ্রষ্টব্য: এটি সর্বনিম্ন প্রস্থ: মানটি কখনই কাটা হয় না))

.এর পরে পূর্ণসংখ্যার নম্বর বা *, বা কোনওটি রূপান্তরটির যথার্থতা নির্দিষ্ট করে না। ক্ষেত্রে যখন * ব্যবহৃত হয়, প্রচ্ছন্নতা টাইপ int এর অতিরিক্ত যুক্তির দ্বারা নির্দিষ্ট করা হয়। যদি এই যুক্তির মান negativeণাত্মক হয় তবে তা উপেক্ষা করা হবে। যদি কোনও সংখ্যা বা * ব্যবহার না করা হয় তবে যথার্থতা শূন্য হিসাবে নেওয়া হয়। নির্ভুলতার নির্ভুল প্রভাবের জন্য নীচের টেবিলটি দেখুন।

সুতরাং আমরা যদি উভয় রূপান্তর স্পেসিফিকেশন চেষ্টা

#include <stdio.h>

int main() {
    int precision = 8;
    int biggerPrecision = 16;
    const char *greetings = "Hello world";

    printf("|%.8s|\n", greetings);
    printf("|%.*s|\n", precision , greetings);
    printf("|%16s|\n", greetings);
    printf("|%*s|\n", biggerPrecision , greetings);

    return 0;
}

আমরা আউটপুট পেতে:

|Hello wo|
|Hello wo|
|     Hello world|
|     Hello world|

12

আমি মনে করি না উপরের কোডটি সঠিক তবে (এই বিবরণ অনুসারে printf()) .*উপায়টি

প্রস্থটি বিন্যাসের স্ট্রিংয়ে নির্দিষ্ট করা হয়নি তবে ফর্ম্যাট করতে হবে এমন যুক্তির পূর্ববর্তী অতিরিক্ত পূর্ণসংখ্যার মান যুক্তি হিসাবে ''

সুতরাং এটি একটি আর্গুমেন্ট হিসাবে প্যাসেবল প্রস্থ সহ একটি স্ট্রিং।


2
আমি ইউআরএল ক্রস-রেফারেন্স যুক্ত করেছি যাতে আপনি চুরির অভিযোগটি এড়াতে পারেন। অবশ্যই, সঠিক উক্তিটি " প্রস্থটি নয়…" এর পরিবর্তে " নির্ভুলতা নয় ..." বলে ।
জোনাথন লেফলার

@MattMcNabb হিসাবে নির্দিষ্ট, যে পেজটি প্রতি রেফারেন্স যে "হাইলাইট নয় একটি পূর্ণসংখ্যা মান " ঠিক int(অথবা এটা একটি উপসেট) - আরও বেশি ধারণাসম্পন্ন মত না শুধু কোনো অবিচ্ছেদ্য মান size_tবা তার সম্ভাব্য alias লেখা, মত std::string::size_type। এটি আরও বিভ্রান্তিকর, বিবেচনায় নেওয়া যে রেফারেন্সড পৃষ্ঠাটি size_tসমর্থিত ধরণের স্পেসিফায়ারগুলির একটি হিসাবে উল্লেখ করেছে ।
আন্তন স্যামসনভ

10

দেখুন: http://www.cplusplus.com/references/clibrary/cstdio/printf/

.* যথার্থতাটি ফর্ম্যাট স্ট্রিংয়ে নির্দিষ্ট করা হয়নি, তবে ফর্ম্যাট করতে হবে এমন আর্গুমেন্টের পূর্ববর্তী অতিরিক্ত পূর্ণসংখ্যার মান যুক্তি হিসাবে।

s অক্ষরের স্ট্রিং

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