Quelltextunterschiede zwischen %s und %1s

Back2toxic

Erfahrenes Mitglied
Hallo Gemeinde,

ich habe hier ein - für mich neues - Problem. Gut, normalerweise achte ich auch nicht wirklich auf den generierten Quelltext. Hier und da ein \n zur besseren Lesbarkeit und das wars dann aber auch.

Jetzt habe ich aber CodeGolf entdeckt und direkt das Problem "Saving Time" begonnen.

Klappt auch alles wunderbar, aber dabei ist mir im Quelltext etwas komisches untergekommen - ich hoffe einer von euch kann mir das erklären.

Es handelt sich hierbei um die Funktion vprintf mit folgendem Input
Code:
        %s
    %s       %s

 %s             %s

%s               %s

 %s             %s

    %s       %s
        %s

Als Argument gebe ich ein Array der Länge 12 mit.

Zunächst einmal: Warum fügt mir vprintf den Inhalt des Arrays nicht ein, wenn ich als Platzhalter nur "%" an Stelle von "%s" nehme? Laut Doc sollte "%" genau so funktionieren, nur dass eben kein Argument hierfür erwartet wird... Ist aber auch nur nebensächlich, meine Hauptfrage ist diese:

Wenn ich nur "%s" als Platzhalter verwende ist mein Quelltext genau wie gewünscht:
Code:
        o
    o       h

 o             o

s               o

 o             o

    o       o
        o

Verwende ich jedoch "%Ns", so sieht mein Quelltext plötzlich so aus:
Code:
        o
               o        h

           o               o

         s                  o

         o                 o

           o            o
              o


Ich bin mir fast zu 100% sicher, dass ich hier etwas falsch mache bzw. falsch verstanden habe und bitte deshalb um Aufklärung.

Vielen Dank schonmal :)

Grüße,
Chris
 
Zunächst einmal: Warum fügt mir vprintf den Inhalt des Arrays nicht ein, wenn ich als Platzhalter nur "%" an Stelle von "%s" nehme? Laut Doc sollte "%" genau so funktionieren, nur dass eben kein Argument hierfür erwartet wird...
Kann ich aus der Doku nicht rauslesen. An welcher Stelle steht, dass ein einzelnes % auch reicht?

Zu deinem anderen Problem: zeig uns deinen Quelltext.

Grüße,
Matthias
 
Das mit dem einzelnen % stimmt, habe gerade nochmal genau nachgelesen.

%% wäre demnach möglich, bringt mich aber auch zu keinem Ergebnis.

Das Zeug in den Code-Tags ist der komplette Quelltext :)

Ich mach den Code eben etwas lesbarer, bei CodeGolf geht's ja darum ein Problem in so wenig Byte wie möglich zu lösen.
PHP:
<?php 
  //fscanf(STDIN,"%d:%d",$h,$m);
  $h=13; $m=24;
  $s=(array_combine(array(0,11,1,10,2,9,3,8,4,7,5,6),array_fill(0,12,"o")));
  $s[$h>12?$h-12:$h]='h';
  $m=($m-$m%5)/5;
  $s[$m]=($s[$m]=="h")?"x":"m";
  vprintf("<pre>        %s
    %s       %s

 %s             %s

%s               %s

 %s             %s

    %s       %s
        %s</pre>",$s);
?>

die <pre>-Tags dienen nur der Lesbarkeit am Screen und sind sonst nicht im Script, auch wird $h und $m sonst über STDIN gefüllt.
 
Zuletzt bearbeitet:
Warum fügt mir vprintf den Inhalt des Arrays nicht ein, wenn ich als Platzhalter nur "%" an Stelle von "%s" nehme? Laut Doc sollte "%" genau so funktionieren, nur dass eben kein Argument hierfür erwartet wird
Das steht da nicht bzw. du hast es falsch verstanden.
Da steht im Prinzip das : %% = %
Also zwei Prozentzeichen ergeben ganz einfach ein Prozentzeichen.

Verwende ich jedoch "%Ns", so sieht mein Quelltext plötzlich so aus:
Was soll denn %N sein? Kann ich nirgends entdecken.
 
Das Zeug in den Code-Tags ist der komplette Quelltext :)
Das war vielleicht die Ausgabe deines Scripts, aber nicht dessen Quelltext.

Ich mach den Code eben etwas lesbarer, bei CodeGolf geht's ja darum ein Problem in so wenig Byte wie möglich zu lösen.
PHP:
<?php 
  //fscanf(STDIN,"%d:%d",$h,$m);
  $h=13; $m=24;
  $s=(array_combine(array(0,11,1,10,2,9,3,8,4,7,5,6),array_fill(0,12,"o")));
  $s[$h>12?$h-12:$h]='h';
  $m=($m-$m%5)/5;
  $s[$m]=($s[$m]=="h")?"x":"m";
  vprintf("<pre>        %s
    %s       %s

 %s             %s

%s               %s

 %s             %s

    %s       %s
        %s</pre>",$s);
?>
Das sieht schon besser aus. Aber ich hätte mich eigentlich eher für die noch nicht funktionierende Variante mit %Ns interessiert.

Grüße,
Matthias
 
Ah, okay, Wikipedia sagt Quelltext und Quellcode sind das selbe...
Ich habe bisher zwischen Quelltext (Browser) und Quellcode unterschieden...

PHP:
<?php 
  //fscanf(STDIN,"%d:%d",$h,$m);
  $h=13; $m=24;
  $s=(array_combine(array(0,11,1,10,2,9,3,8,4,7,5,6),array_fill(0,12,"o")));
  $s[$h>12?$h-12:$h]='h';
  $m=($m-$m%5)/5;
  $s[$m]=($s[$m]=="h")?"x":"m";
  vprintf("<pre>        %0s
    %11s       %1s

 %10s             %2s

%9s               %3s

 %8s             %4s

    %7s       %5s
        %6s</pre>",$s);
?>

Ich habe aber mittlerweile sowieso einen kürzeren Lösungsweg gefunden... Über eine Klärung der unterschiedlichen Ausgaben wäre ich jedoch trotzdem froh.
 
%0s bedeutet etwas anderes als %0$s.
Bei %0s bezeichnet die 0 die Anzahl an Füllzeichen.
Siehe doku:
PHP:
printf("[%10s]\n",    $s); // rechtsbündige Ausgabe, mit Leerzeichen aufgefüllt
/*
[    monkey]
*/
 
Zuletzt bearbeitet:
Japp, das hab ich gerade eben auch herausgefunden.. Vielen Dank für die Info!!
Allerdings ist anzumerken, dass %Ns N-s Füllzeichen einfügt, nicht N.
 
Zuletzt bearbeitet:
Zurück