كيفية طباعة شرطة أو نقطة باستخدام fprintf / printf؟

StackOverflow https://stackoverflow.com/questions/451475

  •  19-08-2019
  •  | 
  •  

سؤال

واعتبارا من الآن أنا باستخدام تحت خط الطباعة باستخدام لنقطة خارج

fprintf( stdout, "%-40s[%d]", tag, data);

وأتوقع أن يكون الإخراج شيء من هذا القبيل التالية،

Number of cards..................................[500]
Fixed prize amount [in whole dollars]............[10]
Is this a high winner prize?.....................[yes]

وكيفية طباعة شرطة أو نقطة باستخدام fprintf / printf؟

هل كانت مفيدة؟

المحلول

ونهج أسرع:

إذا أكبر قدر ممكن من الحشو أن عليك من أي وقت مضى في حاجة يعرف مقدما (كما هو الحال عندما كنت تنسيق جدول ذو عرض ثابت مثل واحد لديك عادة)، يمكنك استخدام "padder" ثابت سلسلة ومجرد الاستيلاء على قطعة للخروج منه. هذا وسوف يكون أسرع من استدعاء printf أو cout في حلقة.

static const char padder[] = "......................"; // Many chars

size_t title_len = strlen(title);
size_t pad_amount = sizeof(padder) - 1 - title_len;

printf(title); // Output title

if (pad_amount > 0) {
    printf(padder + title_len); // Chop!
}

printf("[%d]", data);

هل يمكن حتى تفعل ذلك في عبارة واحدة، مع بعض قفزة الإيمان:

printf("%s%s[%d]", title, padder + strlen(title), data);

نصائح أخرى

ويمكنك القيام بذلك بسهولة مع iostreams بدلا من printf

cout << setw(40) << setfill('.') << left << tag[i] << '[' << data[i] << ']' << endl;

وأو إذا كنت حقا بحاجة إلى استخدام fprintf (مثلا، يتم تمرير لكم FILE * الكتابة إلى)

strstream str;
str << setw(40) << setfill('.') << left << tag[i] << '[' << data[i] << ']' << endl;
printf(%s", str.str());

وأنت لا تستطيع أن تفعل ذلك في بيان واحد. يمكنك استخدام sprintf، ثم استبدال النقاط للمساحات نفسك، أو القيام شيء من هذا القبيل

int chars_so_far;
char padder[40+1]= '..........'; //assume this is 40 dots.
printf("%.40s%n",tag,&chars_so_far);
printf("%s[%d]",padder+chars_so_far,data);

وتحرير:   مبسطة بلدي على سبيل المثال أعلاه على أساس مفهوم padderAtes. بهذه الطريقة لا تتطلب أي 'قفزات من الإيمان "، حول ما إذا كانت سلسلة العلامة كبيرة جدا أو صغيرة جدا - دائما يبدأ البيانات في العمود 41

وأنت تسير لدينا لإخراج السلسلة مع نقطة أو شرطة الحشو نفسك.

وشيء من هذا القبيل (يغفر لي C، انها صدئ):

printAmount(char *txt, int amt) {
    printf("%s",txt);
    for(int xa=strlen(txt); xa<40; xa++) { putc('.'); }
    printf("[%d]",amt);
    printf("\n");
    }

وحل آخر باستخدام وظيفة المساعد صغيرة

static inline size_t min(size_t a, size_t b)
{
    return a < b ? a : b;
}

وبعد ذلك، يمكنك القيام بما يلي:

char padder[] = "........................................";
int len = min(strlen(tag), sizeof(padder) - 1);
printf("%.*s%s[%d]", len, tag, padder + len, data);

وهذا هو أساسا ما نشر آتش، لكني أحسب فعلا هذا من تلقاء نفسي.)

وأنا أقترح كتابة الوظيفة التي منصات سلسلة مع X الشخصيات واستخدام ذلك لتوليد الوسيطة الأولى لسلسلة printf الخاص بك. شيء من هذا القبيل:

char s[40];
pad_str(tag, s, 40, '.');
fprintf( stdout, "%-40s[%d]", s, data);

لاحظ أن السطر الثالث من نموذج البيانات الخاص بك يحتاج هذا التنسيق:

"%-40s[%s]"

وأعتقد أن هناك طريقة أفضل.

#include <string.h>
#include <stdio.h>

#define MIN(A,B) ((A)<(B)?(A):(B))
char *dashpad(char *buf, int len, const char *instr) {
    memset(buf, '-', len);
    buf[len] = 0;
    int inlen = strlen(instr);
    memcpy(buf, instr, MIN(len, inlen));
    return buf;
}
main() {
    char buf[40];
    printf("%s\n", dashpad(buf, 40, "Hello world, dash padded "));
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top