ما هو الحد الأدنى للحجم المخزن المؤقت ل Sprintf مع٪ ز؟

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

  •  12-09-2019
  •  | 
  •  

سؤال

المشكلة هي تخصيصها بشكل ثابت عازلة كبيرة بما يكفي لتناسب المزدوج المطبوع، مع تنسيق٪ G في أقصى دقة. هذا يبدو وكأنه مهمة بسيطة بما فيه الكفاية، بو أواجه مشكلة. أفضل ما حدث مع (على افتراض أن الرقم الذي سيتم طباعته هو x) هو

char buf[1 + DBL_DIG + DBL_DIG + 1 + 1 + 1 + DBL_DIG + 1];
int len = sprintf(buf, "%.*g", DBL_DIG, x);

ماكرو DBL_DIG هو من Float.h، ويبدو أنه من المفترض أن يشير إلى أقصى دقة للنوع المزدوج. نحن نحتاج:

  • 1 بايت للحصول على علامة سلبية
  • بايت كافية لالتقاط الأرقام الهامة
  • في معظم "فاصل" سار (فاصلة، إلخ) لكل رقم
  • 1 البايت لمدة عشرية
  • 1 بايت ل 'e'
  • 1 بايت للعلامة على الأس
  • بعض البايتات للأسف
  • 1 البايت للاغتة الزائدة التي كتبها sprinthf.

أنا أستخدم عدد الأرقام المهمة كملزم أعلى على عدد الأرقام في الأساس. هل صنعت أي أخطاء؟ هل هناك حل أفضل؟ يجب علي تخصيص 64 أو 128 أو 256 بايت وأتمنى للأفضل؟

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

المحلول 4

بدلا من استخدام sprintf, ، يمكنك استخدام asprintf. وبعد هذا يخصص مخزن مؤقت للحجم الصحيح لتناسب سلسلةك.

نصائح أخرى

لا يمكنك حساب الحجم مسبقا في وقت الترجمة. يأخذ Pronstratter٪ G Locale في الاعتبار (لفصل 1000 وما إلى ذلك) انظر http://linux.die.net/man/3/sprintf. للحصول على وصف حول كيفية حساب الحجم بأمان.

يستخدم snprintf() لمعرفة عدد الأحرف التي تحتاجها:

#include <float.h> /* DBL_DIG */
#include <stdio.h>
#include <stdlib.h>

int main(void) {
  double x = rand() / (double)RAND_MAX;
  char find_len[1];
  int need_len;
  char *buf;

  need_len = snprintf(find_len, 1, "%.*g", DBL_DIG, x);
  buf = malloc(need_len + 1);
  if (buf) {
    int used = sprintf(buf, "%.*g", DBL_DIG, x);
    printf("need: %d; buf:[%s]; used:%d\n", need_len, buf, used);
    free(buf);
  }
  return 0;
}

تحتاج إلى مترجم C99 ل snprintf().
snprintf() تم تعريفه بواسطة معيار C99. تنفيذ C89 غير مطلوب snprintf() محددة، وإذا كان لها امتداد، فلا يطلب من "العمل" كما هو موضح من قبل معيار C99.

شيئان:٪ G لا يعرض كل الأرقام الممثلة، ويظهر٪ g نتيجة لطيفة للبشر تقريب. يمكنك تحديد الدقة باستخدام٪ f أو٪ e إذا كنت ترغب في نتيجة مختلفة.

لا تستخدم Sprintf أبدا () بدلا من استخدام SPRINTF (). في حالتك:int len = snprintf(buf, dimensionof(buf), "%.*f", DBL_DIG, x);

هل يجب علي فقط تقريب ما يصل إلى 64 أو 128 أو 256 وأتمنى للأفضل؟

نعم، فقط تفعل ذلك

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