سؤال

في C ++:

int main()
{
    cout << setfill('#') << setw(10) << 5 << endl;

    return 0;
}

المخرجات:

#########5

هل هنالك أي setfill() بديل لـ C؟ أو كيفية القيام بذلك في C دون إنشاء السلسلة يدويًا؟

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

المحلول

لا ، لا يوجد بديل مباشر.

ولكن إذا كان لديك رفاهية snprintf (واحد يتصرف كما هو موضح في معيار C99) ، وهذا يعمل دون إنشاء سلسلة جديدة ؛ إنشاء 2 مؤقت فقط intس

#include <stdio.h>

int main(void) {
  int filler = '#'; /* setfill('#') */
  int width = 10;   /* setw(10)     */
  int target = 5;   /* 5            */

  /* ******** */
  int s = snprintf(NULL, 0, "%d", target);
  for (int i = 0; i < width - s; i++) {
    putchar(filler);
  }
  printf("%d\n", target);
  /* ******** */

  return 0;
}

تحرير: تشغيل الإصدار في ideone.


EDIT2: الاختلافات بين معيار C99 snprintf و Windows _snprintf (شكرا لك على الرابط ، بن):

  • النموذج المبدئي: int snprintf(char *restrict buffer, size_t n, const char *restrict format, ...);
  • النموذج المبدئي: int _snprintf(char *buffer, size_t n, const char *format, ...);
  • snprintf لا يكتب أكثر من (N-1) بايت و NUL
  • _snprintf لا يكتب أكثر من (ن) بايت ، آخرها قد يكون NUL أو غيرها
  • snprintf إرجاع عدد الأحرف اللازمة للتنسيق (يمكن أن يكون أكبر من n) أو -1 في حالة تشفير الخطأ
  • _snprintf إرجاع قيمة سالبة إذا n ليست كبيرة للسلسلة. أو n إذا لم تتم كتابة بايت نول إلى المخزن المؤقت.

يمكنك تشغيل السوء _snprintf في حلقة ، زيادة n حتى تجد القيمة الصحيحة

/* absolutely not tested, written directly on SO text editor */
int i;
size_t rightvalue = 0;
char buffer[SOME_DEFAULT_VALUE];
do {
    if (sizeof buffer < rightvalue) /* OOPS, BIG BIG OOPS */;
    i = _snprintf(buffer, rightvalue, "%d", 42);
} while (i != rightvalue++);
/* rightvalue already has space for the terminating NUL */

نصائح أخرى

 int x= 5; 
 printf("%010d",x);

الإخراج: 0000000005

الآن إذا كنت تريد حقًا "#" بدلاً من "0" ، فسوف يتعين عليك استبدالها يدويًا في السلسلة.

يمكن :

char buf[11], *sp = buf; 
snprintf(buf, 11, "%10d", x); 
while( (sp = strchr(sp, ' ')) != '\0'){ *sp = '#'; }
puts(buf); 

الجميع يريد الاتصال printf مرتين... printf هي واحدة من أغلى الوظائف حولها.

هنا:

char buffer[18] = "##########";
puts(buffer + snprintf(buffer+strlen(buffer), 8, "%d", 5));

غير مدمج كمعيار

من المحتمل أن أقوم بتشغيل الرقم إلى سلسلة وأحصل على عدد الأحرف ثم إخراج الرقم الصحيح من "#" أولاً قبل طباعة السلسلة.

ما يلي سيفعل ذلك باستخدام memset في C على افتراض شار 1 بايت. لا يزال يخلق "سلسلة" ، على الرغم من أنني لست متأكدًا من مدى رغبتك يدويًا.

int main(void)
{

   char buf[MAX_LENGTH];

   memset(buf, '#', 10);
   buf[10]='\0';
   printf("%s5\n", buf);
}

اعتمادًا على ما تريد فعله فعليًا ، يمكنك إنشاء المخزن المؤقت بشكل ديناميكي ليكون الحجم المناسب وإعادته من وظيفة المساعدة إذا كنت ترغب في ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top