2016-09-16 5 views
4

Ich versuche, diese Strings mit ihren jeweiligen Indizes auszurichten. Die Saiten wie folgt aussehen:Strings gleichmäßig ausrichten

char *mystrings[] = {"Fred", "Augustine", "Bob", "Lenny", "Ricardo"}; 

und meine Ausgabe sieht wie folgt aus:

Fred 0 
Augustine 1 
Bob 2 
Lenny 3 
Ricardo 4 

Aber ich bin nach etwas, was wie folgt aus:

Fred  0 
Augustine 1 
Bob  2 
Lenny  3 
Ricardo 4 

Wobei die Indizes die gleiche ausgerichtet sind, . Ich versuche nur, es lesbarer zu machen. So sieht mein Code bisher aus:

#include <stdio.h> 
#include <stdlib.h> 

int 
main(void) { 
    int i; 
    char *mystrings[] = {"Fred", "Augustine", "Bob", "Lenny", "Ricardo"}; 

    for (i = 0; i < 5; i++) { 
     printf("%s %d\n", mystrings[i], i); 
    } 

    return 0; 
} 

Gibt es eine Möglichkeit, das kann ich tun? Wie vergleiche man die Indizes mit der längsten Zeichenkette und mache dann die Leerzeichen für die ganzen Zahlen so?

+7

Siehe "Feldbreite" in der [printf man page] (http: // lin ux.die.net/man/3/printf) – kaylum

+2

Warum 'MAXSIZE' in 'char * Mistrings [MAXSIZE]' - Holen Sie den Compiler, um die Arbeit zu tun, dh 'char * Mistrings [] ,,,' –

+0

@EdHeal meine Schlecht. Ich werde das ändern. – RoadRunner

Antwort

6

Zusatzschleife, um die maximale Breite zu berechnen, dann mit dem * printf Flag, das die Breite von einem Argument nehmen (die multipliziert wird, durch -1, um die linke Ausrichtung zu bewirken)

char *mystrings[] = {"Fred", "Augustine", "Bob", "Lenny", "Ricardo"}; 
int width = 0; 
for (int i = 0; i < sizeof(mystrings)/sizeof(char*); i++) { 
    width = strlen(mystrings[i]) > width? strlen(mystrings[i]) : width; 
} 

for (int i = 0; i < sizeof(mystrings)/sizeof(char*); i++) { 
    printf("%*s %d\n", -1 * width, mystrings[i], i); 
} 
+0

Dies ist der beste Weg, es zu tun. –

2

Sie müssen eine Breite für die Zeichenfolge in der Formatspezifikation angeben.
Dann müssen Sie den Spezifizierer - verwenden, um anzugeben, dass die Ausgabe linksbündig sein soll.

Mit

printf("%-10s %d\n", mystrings[i], i); 

werden 10 Zeichen für mystrings[i] verwenden und die Ausgabe links rechtfertigen.

Eine solche Zahl hart zu codieren ist ein Problem, wenn Sie die Längen der Strings nicht kennen. Um Ihr Programm etwas robuster zu machen, können Sie die maximale Länge der Strings berechnen und dann die Formatzeichenfolge daraus berechnen.

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

#define MAXSIZE 5 

int main(void) { 
    int i; 
    char *mystrings[MAXSIZE] = {"Fred", "Augustine", "Bob", "Lenny", "Ricardo"}; 

    int maxLen = 0; 
    for (i = 0; i < MAXSIZE; i++) { 
     int len = strlen(mystrings[i]); 
     maxLen = (len > maxLen) ? len : maxLen; 
    } 

    char formatString[50]; 
    sprintf(formatString, "%%-%ds %%d\n", maxLen + 1); 

    for (i = 0; i < MAXSIZE; i++) { 
     printf(formatString, mystrings[i], i); 
    } 

    return 0; 
} 

Ausgabe

Fred  0 
Augustine 1 
Bob  2 
Lenny  3 
Ricardo 4 
+0

Feine Lösung von dem, was ich sehen kann, aber den Pfad der dynamischen Formatzeichenfolgen zu gehen, ist meiner Meinung nach etwas, das C-Programmierer vermeiden sollten, es sei denn, absolut notwendig. –

+0

@self einen bestimmten Grund für die Vermeidung von dynamischen Formatzeichenfolgen? (Außer, dass sie vielleicht schwer zu lesen sind) ((und Karten zu Läusen in Nethack ..oder Rogue, ich vergesse)) – Tibrogargan

+2

@Tribrotaran Wenn es einfach so passiert, dass Format-String von Benutzereingaben kommt, wird es zu einer Schwachstelle. Nicht, dass dies hier der Fall wäre, aber im Allgemeinen möchten Sie nicht, dass Benutzereingaben als Formatzeichenfolge verwendet werden. –

2

Was brauchen Sie ist bei der maximalen Länge eines Strings kommen zu tun. Sie können die maximale Länge eines Strings und dann eine einfache Arithmetik berechnen, um herauszufinden, wie viel Füllmenge (Leerzeichen am Ende eines Strings) Sie benötigen. Ohne zu verwenden printf, und für Bildungszwecke, zeige ich Ihnen, wie Sie es tun können.

Output:

Fred  0 
Augustine 1 
Bob  2 
Lenny  3 
Ricardo 4 

Hier ein Beispiel:

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

static size_t max_len(const char * const data[], size_t size) { 
    size_t i = 0; 
    size_t max = strlen(data[0]); 

    for(i = 1; i < size; i++) { 
     size_t len = strlen(data[i]); 

     if(len > max) { 
      max = len; 
     } 
    } 
    return max; 
} 

int main(void) { 
    const char *const mystrings[] = { 
     "Fred", "Augustine", "Bob", "Lenny", "Ricardo" 
    }; 

    size_t m = max_len(mystrings, 5); 
    size_t i; 

    for(i = 0; i < 5; i++) { 
     const char *item = mystrings[i]; 
     size_t len = strlen(item); 
     size_t padding = 0; 
     /* +1 for padding byte */ 
     if(len + 1 < m) { 
      padding = m - len; 
     } 

     printf("%s ", item); 

     size_t ii; 

     for(ii = 0; ii < padding; ii++) { 
      fputc(' ', stdout); 
     } 

     printf("%zu\n", i); 
    } 

    return 0; 
} 
Verwandte Themen