/ scanf ailede biçim% n için herhangi pratik uygulamalar var mı?

oy
17
int x;
printf(hello %n World\n, &x);
printf(%d\n, x);
Oluştur 09/12/2008 saat 18:45
kaynak kullanıcı
Diğer dillerde...                            


8 cevaplar

oy
15

O için çok kullanışlı değil printf()ama için çok yararlı olabilir sscanf()Birden tekrarlamalar bir dize ayrıştırma için, özellikle. fscanf()ve scanf()otomatik giriş okuma miktarına göre kendi iç işaretçileri ilerlemek ama sscanf()yok. Örneğin:

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
    ...
}
Cevap 09/12/2008 saat 19:02
kaynak kullanıcı

oy
5

Gerçekleştirmek için kullanılabilecek kötülüklerini .

Cevap 09/12/2008 saat 19:08
kaynak kullanıcı

oy
4

Eğer pratik ile ne demek bağlıdır. (S [n] printf bir dizgi arabelleğine baskı ve örneğin uzunluğunu hesaplamak) bunu gerçekleştirmek için başka yollar her zaman vardır.

ancak

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);

üretmelidir

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

(Denenmemiş olmasına rağmen, bir C derleyicisi yakın değilim)

Hangi sadece şeyler hizalayarak bir yolu olarak pratik hakkında ama ben kodunda görmek istemem. bunu yapmanın daha iyi yolları vardır.

Cevap 09/12/2008 saat 19:02
kaynak kullanıcı

oy
3

Oldukça ezoterik bu. Oluşturulan dizede bir yer tutucu değiştirmeniz gerekiyorsa daha sonra özgün Printf parametreyi kaydetmek veya dize ayrıştırmak ya yok ki, dize ortasına bir dizin hatırlamak isteyebilirsiniz.

Cevap 09/12/2008 saat 18:53
kaynak kullanıcı

oy
1
#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;
}

Emin burada bir şey eksik. Tomatos çok uzakta sağda.

Cevap 09/12/2008 saat 20:19
kaynak kullanıcı

oy
1

Bu muhtemelen çeşitli alt dizeleri uzunlukları almak için hızlı bir yol olarak kullanılabilir.

Cevap 09/12/2008 saat 18:57
kaynak kullanıcı

oy
0

arayabilirsin

int _get_printf_count_output();

% N desteği etkinleştirmek veya kullanmak olup olmadığını görmek için

int _set_printf_count_output( int enable );

Etkinleştirme veya% n formatının desteğini devre dışı bırakmak için.

MSDN VS2008 dan

Cevap 27/04/2010 saat 14:02
kaynak kullanıcı

oy
0

İşte VS2005 CRT koddan şey:

/* 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;
}

hangi Bu getirir:

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

aşağıdaki satırı için:

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

Bu @eJames bahsettiğini önlem asıl olarak tahmin ediyorum

Cevap 09/12/2008 saat 19:46
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more