هل هناك أي تطبيقات عملية لتنسيق ٪ n في عائلة printf/scanf؟

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

  •  20-08-2019
  •  | 
  •  

سؤال

int x;
printf("hello %n World\n", &x);
printf("%d\n", x);
هل كانت مفيدة؟

المحلول

انها ليست مفيدة جدا printf(), ، ولكن يمكن أن يكون مفيدا جدا ل sscanf(), ، خاصة إذا كنت تقوم بتحليل سلسلة في تكرارات متعددة. fscanf() و scanf() تلقائيًا تقدم مؤشراتها الداخلية بمقدار قراءة الإدخال ، ولكن sscanf() لا. فمثلا:

char stringToParse[256];
...
char *curPosInString = stringToParse;  // start parsing at the beginning
int bytesRead;
while(needsParsing())
{
    sscanf(curPosInString, "(format string)%n", ..., &bytesRead);  // check the return value here
    curPosInString += bytesRead;  // Advance read pointer
    ...
}

نصائح أخرى

يمكن استخدامه للأداء أفعال شريرة.

يعتمد على ما تقصده بعملية. هناك دائمًا طرق أخرى لإنجازها (طباعة في مخزن مؤقت للسلسلة مع printf s وحساب الطول ، على سبيل المثال).

لكن

int len;
char *thing = "label of unknown length";
char *value = "value value value"
char *value2="second line of value";
printf ("%s other stuff: %n", thing, &len);
printf ("%s\n%*s, value, len, value2);

يجب أن تنتج

label of unknown length other stuff: value value value
                                     second line of value

(على الرغم من عدم اختباره ، أنا لست بالقرب من مترجم C)

وهو أمر عملي فقط كوسيلة لمحاذاة الأشياء ، لكنني لا أرغب في رؤيتها في التعليمات البرمجية. هناك طرق أفضل للقيام بذلك.

إنه باطني إلى حد ما. إذا كنت بحاجة إلى استبدال عنصر نائب في السلسلة التي تم إنشاؤها لاحقًا ، فقد ترغب في تذكر فهرس في منتصف السلسلة ، بحيث لا يتعين عليك إما حفظ معلمة printf الأصلية أو تحليل السلسلة.

يمكن استخدامه كوسيلة سريعة للحصول على أطوال الأساسيات المختلفة.

#include <stdio.h>
int main(int argc, char* argv[])
{
    int col10 = (10 - 1);
    int col25 = (25 - 1);

    int pos1 = 0;
    int pos2 = 0;

    printf("    5    10   15   20   25   30\n");

    printf("%s%n%*s%n%*s\n",                     "fried", 
                            &pos1, col10 - pos1, "green",   
                            &pos2, col25 - pos2, "tomatos");


    printf("    ^    ^    ^    ^    ^    ^\n");

    printf("%d %d\n", pos1, pos2);
    printf("%d %d\n", col10 - pos1, col25 - pos2);

    return 0;
}

أنا أفتقد شيئًا هنا بالتأكيد. Tomatos بعيد جدا إلى اليمين.

إليك شيء من رمز VS2005 CRT:

/* if %n is disabled, we skip an arg and print 'n' */
if ( !_get_printf_count_output() )
{
   _VALIDATE_RETURN(("'n' format specifier disabled", 0), EINVAL, -1);
   break;
}

الذي يظهر هذا:

alt text http://www.shiny.co.il/shooshx/printfn.png

للسطر التالي:

    printf ("%s other stuff: %n", thing, &len);

أظن أن هذا هو في الأساس لتجنب ما يتحدث عنه eJames

تستطيع الاتصال

int _get_printf_count_output();

لمعرفة ما إذا كان دعم ٪ n هو تمكين أو استخدام

int _set_printf_count_output( int enable );

لتمكين أو تعطيل دعم نسبة ٪ n.

من MSDN VS2008

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