سؤال

أي شخص يمكن أن تشير لي إلى مصدر رمز الملف أو مجموعة جيدة قابلة لإعادة الاستخدام تنفيذ sprintf() في " ج " التي لا يمكن تخصيص كما في بلدي حاجة ؟

شرح لماذا كنت في حاجة إليها:سلاسل ليست فارغة إنهاؤها في قانون بلدي (ثنائي متوافق).ولذلك sprintf("%s") هي عديمة الفائدة إلا إذا أصلح رمز إلى فهم كيفية تقديم سلسلة.

بفضل quinmars لافتا أن هناك طريقة لطباعة سلسلة من خلال %s دون إنهاء null.على الرغم من أنه لا يحل ديهم requriement الآن سوف تحتاج في نهاية المطاف إلى sprintf (أو snprintf) تنفيذ على أعلى مستوى الوظائف التي تستخدم المتغيرات.من الأخرى المذكورة حتى الآن يبدو لي أن سكليتي التنفيذ هو أفضل.شكرا دوغ كوري لافتا بها.

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

المحلول

أنا لم أجربها لأني لا يكون مترجم هنا, ولكن قراءة الصفحة رجل يبدو أنه يمكنك تمرير الدقة '%s':

...إذا كانت الدقة ، أي حرف null تحتاج إلى أن يكون الوقت الحاضر ؛ إذا كانت الدقة غير محددة ، أو أكبر من حجم مجموعة ، مجموعة يجب أن يحتوي على إنهاء NUL حرف.

إذا كنت قد حاولت أن تفعل شيئا مثل هذا ؟

snprintf(buffer, sizeof(buffer), "%.*s", bstring_len, bstring);

كما قلت أنا لم الاختبار و إذا كان يعمل وهو يعمل طبعا إلا إذا كنت لا '\0'بايت داخل السلسلة.

تحرير: لقد اختبرت ذلك الآن و يعمل!

نصائح أخرى

ويجب عليك حقا أن تبحث عن snprintf (sprintf احترام حجم المخزن المؤقت الإخراج)؛ جوجل يقترح http://www.ijs.si/software/snprintf/ .

وهناك لطيفة تنفيذ المجال العام كجزء من برنامج SQLite هنا .

وأنا أتفق مع Dickon ريد الذي تريد snprintf، والتي يتم تضمينها في النسخة سكليتي.

ولقد استخدمت هذا كود الرجال المصدر. انها صغيرة ومفهومة وسهلة لتعديل (على العكس من الخصلة وLIBC).

ووفقا لهذا link- http://www.programmingforums.org/thread12049.html:

<اقتباس فقرة>   

إذا كان لديك التوزيع دول مجلس التعاون الخليجي الكامل،   مصدر للمكتبة C (سطحي أو   LIBC) هي واحدة من الدلائل   التي تأتي للركوب.

وهكذا يمكنك البحث عنه هناك. أنا لا أعرف كيف مفيدة من شأنها أن تكون ...

والسبب الوحيد الذي أستطيع أن أفكر في الرغبة في تعديل sprintf هو توسيع نطاقه، والسبب الوحيد لتمديد هو عندما كنت في طريقك إلى الكتابة نوعا من المحلل.

إذا كنت تبحث لإنشاء محلل عن شيء مثل لغة ترميز، XML، أو أي شيء حقا مع بناء الجملة، وأقترح أن ننظر إلى Lexers ومحلل المولدات (2 من أكثرها شيوعا هي <وأ href = " http://en.wikipedia.org/wiki/Flex_lexical_analyser "يختلط =" نوفولو noreferrer "> فليكس و <لأ href =" http://en.wikipedia.org/wiki/GNU_bison "يختلط =" نوفولو noreferrer "> بيسون ) التي يمكن الى حد كبير كتابة التعليمات البرمجية معقدة للغاية لموزعي بالنسبة لك (على الرغم من الأدوات نفسها معقدة إلى حد ما).

وخلاف ذلك، يمكنك العثور على رمز لذلك في الملفات المصدر التي تم تضمينها مع Visual Studio (على الأقل 2005 و 2008، قد يكون البعض الآخر، ولكن تلك 2 بالتأكيد القيام).

وsnprintf من سي العمومية للتخصيص عبر آلية هوك / معالج

مجرد فكرة ... مثال:

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

int sprintf(char * str, const char * format, ... )    
{// Here you can redfine your input before continuing to compy with standard inputs
    va_list args;
    va_start(args, format);
    vsprintf(str,format, args);// This still uses standaes formating
    va_end(args);
    return 0;// Before return you can redefine it back if you want...
}
int main (void)
{
    char h[20];
    sprintf(h,"hei %d ",10);
    printf("t %s\n",h);
    getchar();
    return 0;
}
scroll top