هل هناك أي بديل setFill () لـ C؟
-
28-09-2019 - |
سؤال
في 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);
}
اعتمادًا على ما تريد فعله فعليًا ، يمكنك إنشاء المخزن المؤقت بشكل ديناميكي ليكون الحجم المناسب وإعادته من وظيفة المساعدة إذا كنت ترغب في ذلك.