webentwicklung-frage-antwort-db.com.de

Wie stelle ich eine solche Zahl in C ein?

Ich muss eine Reihe von Zahlen in C mit printf () wie im folgenden Beispiel ausrichten:

-------1
-------5
------50
-----100
----1000

Natürlich gibt es Zahlen zwischen allen, aber das ist für das vorliegende Thema nicht relevant ... Oh, betrachten Sie die Bindestriche als Leerzeichen, ich habe Bindestriche verwendet, damit ich leichter verstehen kann, was ich will.

Ich kann das nur:

----1---
----5---
----50--
----100-
----1000

Oder dieses:

---1
---5
--50
-100
1000

Aber ich möchte nichts davon und ich kann nicht erreichen, was im ersten Beispiel angezeigt wird, wenn nur printf () verwendet wird. Ist das überhaupt möglich?

BEARBEITEN:
Sorry Leute, ich hatte es eilig und habe mich nicht gut erklärt ... Mein letztes Beispiel und all Ihre Vorschläge (um etwas wie "% 8d" zu verwenden) funktionieren nicht, weil die letzte Zahl 1000 ist nicht unbedingt bis zu 1000 oder sogar 100 oder 10.

Unabhängig von der Anzahl der anzuzeigenden Ziffern möchte ich höchstens 4 führende Leerzeichen für die größte Anzahl. Angenommen, ich muss Ziffern von 1 bis 1000 (A) und 1 bis 100 (B) anzeigen, und ich verwende für beide "% 4d", dies wäre die Ausgabe:

EIN:

---1
....
1000

Welches ist die Ausgabe, die ich will ...

B:

---1
....
-100

Welches ist nicht die Ausgabe, die ich will, ich möchte eigentlich Folgendes:

--1
...
100

Aber wie gesagt, ich weiß nicht genau, wie viele Zahlen ich drucken muss, es kann eine Ziffer haben, es kann 2, 3 oder mehr sein, die Funktion sollte für alle vorbereitet sein. Und ich möchte vier zusätzliche führende Leerzeichen, aber das ist nicht so relevant.

EDIT 2: Es scheint, dass das, was ich will, so wie ich es brauche, nicht möglich ist (siehe Antworten von David Thornley und Blank Xavier und meine Kommentare). Vielen Dank für Ihre Zeit.

29
Ricardo Amaral

Nachschlagen in meiner handlichen Harbison & Steele ....

Bestimmen Sie die maximale Breite der Felder.

int max_width, value_to_print;
max_width = 8;
value_to_print = 1000;
printf("%*d\n", max_width, value_to_print);

Denken Sie daran, dass max_width vom Typ int sein muss, um mit dem Sternchen arbeiten zu können, und Sie müssen es basierend darauf berechnen, wie viel Speicherplatz Sie benötigen. In Ihrem Fall müssen Sie die maximale Breite der größten Zahl berechnen und 4 hinzufügen.

44
David Thornley

Warum funktioniert printf("%8d\n", intval); nicht für Sie? Es sollte...

Sie haben die Formatzeichenfolgen für keines Ihrer "nicht funktionierenden" Beispiele angezeigt, daher bin ich mir nicht sicher, was ich Ihnen sonst sagen soll.

#include <stdio.h>

int
main(void)
{
        int i;
        for (i = 1; i <= 10000; i*=10) {
                printf("[%8d]\n", i);
        }
        return (0);
}

$ ./printftest
[       1]
[      10]
[     100]
[    1000]
[   10000]

EDIT: Antwort auf die Klärung der Frage:

#include <math.h>
int maxval = 1000;
int width = round(1+log(maxval)/log(10));
...
printf("%*d\n", width, intval);

Die Breitenberechnung berechnet die Protokollbasis 10 + 1, die die Anzahl der Ziffern angibt. Mit dem ausgefallenen * können Sie die Variable für einen Wert in der Formatzeichenfolge verwenden.

Sie müssen immer noch das Maximum für einen bestimmten Lauf kennen, aber es gibt keine Möglichkeit, dies in irgendeiner Sprache oder in Bleistift und Papier zu tun.

44
dwc
    printf("%8d\n",1);
    printf("%8d\n",10);
    printf("%8d\n",100);
    printf("%8d\n",1000);
3
Alex B

Konvertieren Sie in einen String und verwenden Sie "% 4.4s" als Formatbezeichner. Dies macht es zu einem Format mit fester Breite.

1
MM

Wenn Sie die Breite nicht im Voraus wissen können, hängt Ihre einzige mögliche Antwort davon ab, ob Sie Ihre Ausgabe in einem temporären Zwischenspeicher ablegen. Bei kleinen Berichten ist es am einfachsten, die Daten zu sammeln und die Ausgabe zu verschieben, bis die Eingabe begrenzt ist.

Bei umfangreichen Berichten kann eine Zwischendatei erforderlich sein, wenn die erfassten Daten angemessene Speichergrenzen überschreiten.

Sobald Sie die Daten haben, können Sie sie einfach in einen Bericht mit dem Idiom printf("%*d", width, value) für jeden Wert nachbearbeiten.

Wenn der Ausgabekanal einen wahlfreien Zugriff zulässt, können Sie alternativ einfach einen Entwurf des Berichts schreiben, der eine (kurze) Standardbreite annimmt, und ihn jedes Mal suchen und bearbeiten, wenn Ihre Breitenannahme verletzt wird. Dies setzt auch voraus, dass Sie die Berichtszeilen auf eine harmlose Weise außerhalb dieses Felds auffüllen können oder dass Sie die Ausgabe bisher durch einen Lese-, Änderungs- und Schreibvorgang ersetzen und die Entwurfsdatei abbrechen möchten.

Wenn Sie jedoch nicht im Voraus die korrekte Breite vorhersagen können, ist es nicht möglich, das zu tun, was Sie wollen, ohne einen Zwei-Pass-Algorithmus.

0
RBerteig

Soweit ich der Frage entnehmen kann, variiert die Menge der Auffüllung, die Sie benötigen, je nach den Daten, die Sie haben. Dementsprechend besteht die einzige Lösung dafür darin, die Daten vor dem Drucken zu scannen, das breiteste Datum zu ermitteln und so einen Breitenwert zu finden, den Sie mit dem Stern-Operator an printf übergeben können, z.

loop over data - get correct padding, put into width

printf( "%*d\n", width, datum );
0
user82238

Sie möchten also ein Feld mit 8 Zeichen und Leerzeichen als Auffüllung? Versuchen Sie "% 8d". Hier ist eine Referenz .

EDIT: Was Sie zu tun versuchen, ist nicht etwas, das von printf alleine gehandhabt werden kann, da es nicht die längste Zahl ist, die Sie schreiben. Sie müssen die größte Zahl berechnen, bevor Sie ein Druckergebnis ausführen, und dann herausfinden, wie viele Stellen Sie als Breite Ihres Felds verwenden. Dann können Sie snprintf oder ähnliches verwenden, um sofort ein printf-Format zu erstellen.

char format[20];
snprintf(format, 19, "%%%dd\\n", max_length);
while (got_output) {
    printf(format, number);
    got_output = still_got_output();
}
0
mkb

Wenn Sie sich die bearbeitete Frage ansehen, müssen Sie die Anzahl der Ziffern in der größten anzuzeigenden Zahl ermitteln und dann das Format printf() mithilfe von sprintf() oder mithilfe von %*d generieren, wobei die Anzahl der Ziffern als int für den * und dann das übergeben wird Wert. Sobald Sie die größte Zahl haben (und Sie müssen dies im Voraus bestimmen), können Sie die Anzahl der Ziffern mit einem 'Integer-Logarithmus'-Algorithmus bestimmen (wie oft können Sie sich durch 10 teilen, bevor Sie auf Null kommen) oder durch Verwendung von snprintf() mit der Pufferlänge von Null das Format %d und null für den String; Der Rückgabewert gibt an, wie viele Zeichen formatiert worden wären.

Wenn Sie die maximale Anzahl vor dem Auftreten nicht kennen und nicht bestimmen können, sind Sie Snooker - es gibt nichts, was Sie tun können.

0
#include<stdio.h>
int main()
{
 int i,j,n,b;
 printf("Enter no of rows ");
 scanf("%d",&n);
 b=n;
 for(i=1;i<=n;++i)
 {
    for(j=1;j<=i;j++)
    {
        printf("%*d",b,j);
        b=1;
    }
        b=n;
    b=b-i;
    printf("\n");


 }
 return 0;
}
0
vino