2017-02-20 9 views
1

Ich arbeite durch die K & R C Programmierbuch, und ich habe gerade Übung 1-13 abgeschlossen, wo Sie ein Histogramm der Länge der Wörter, die eingegeben werden. Mein horizontales Histogramm ist in Ordnung, aber mein vertikales Histogramm hat am Ende ein '%' Zeichen und ich kann nicht herausfinden, warum das so weitergeht. Hier ist die Schleife, die ich denke, das Problem verursacht:Unerwartete '%' erscheint in der Konsole

for (i = 0; i < array_length; i++) { 
    printf("%-4d", i + 1); 
} 

Wenn die array_length 7 ist, werde ich ein ‚%‘ Zeichen nach der 7. Position wie folgt aus:

   |   
       | |  
       | |  
       | |  
       | |  
       | |  
| | |  | |  
| | | | | |  
| | | | | | | 
| | | | | | | 
| | | | | | | 
1 2 3 4 5 6 7 % 

Wenn ich entfernen diese Schleife, die vertikalen Balken drucken gut, ich bekomme einfach nicht die Nummerierung unter jedem von ihnen.

Was geht hier vor? Soweit ich es erraten kann, läuft der printf eine zusätzliche Zeit mit Mülldaten in 'ich', aber ich kann nicht herausfinden, warum oder wie das passiert.

Ich kompiliere mit Gcc auf Ubuntu, wenn das einen Unterschied macht. Hier

ist der vollständige Code für Ihre Referenz:

#include <stdio.h> 

#define IN 1 
#define OUT 0 
#define ARRAY_SIZE 1000 

int main() { 

    int c, current_word_length, state, i, j, current_word, largest, array_length, top; 
    int word_lengths[ARRAY_SIZE]; 

    current_word_length = current_word = largest = 0; 
    state = OUT; 

    for (i = 0; i < ARRAY_SIZE; i++) { 
    word_lengths[i] = 0; 
    } 

    printf("Enter up to 1000 words and this program will calculate their length.\n"); 
    printf("Please enter a newline, tab, or space before the last word entered, then EOF to print summary.\n\n"); 

    while ((c = getchar()) != EOF) { 

    if (c == ' ' || c == '\t' || c == '\n') { 
     if (state == IN) { 
     word_lengths[current_word++] = current_word_length; 
     if (current_word_length > largest) { 
      largest = current_word_length; 
     } 
     current_word_length = 0; 
     state = OUT; 
     } 
    } else { 
     state = IN; 
     current_word_length++; 
    } 

    } 

    array_length = current_word; 

    printf("\nWord Lengths Histogram Horizontal:\n\n"); 

    for (i = 0; i < array_length; i++) { 
    printf("%-4d: ", i + 1); 
    for (j = 0; j < word_lengths[i]; j++) { 
     printf("="); 
    } 
    printf("\n"); 
    } 

    printf("\nWord Lengths Histogram Vertical:\n\n"); 

    top = largest; 

    while (top > 0) { 

    for (i = 0; i < array_length; i++) { 
     if (word_lengths[i] >= top) { 
     printf("%-4c", '|'); 
     } else { 
     printf("%-4c", ' '); 
     } 
    } 

    printf("\n"); 

    top--; 
    } 

    for (i = 0; i < array_length; i++) { 
    printf("%-4d", i + 1); 
    } 

    return 0; 
} 

Und hier ist das, was ich erwarte, dass diese Eingabezeichenfolge auftreten mit "Speck ipsum dolor amet frankfurteren Landjäger Schinken":

Enter up to 1000 words and this program will calculate their length. 
Please enter a newline, tab, or space before the last word entered, then EOF to print summary. 

Bacon ipsum dolor amet frankfurter landjaeger ham 

Word Lengths Histogram Horizontal: 

1 : ===== 
2 : ===== 
3 : ===== 
4 : ==== 
5 : =========== 
6 : ========== 
7 : === 

Word Lengths Histogram Vertical: 

       |   
       | |  
       | |  
       | |  
       | |  
       | |  
| | |  | |  
| | | | | |  
| | | | | | | 
| | | | | | | 
| | | | | | | 
1 2 3 4 5 6 7 
+10

Sind Sie sicher, dass% prompt nicht nur Ihre Schale ist? Füge ein 'printf (" \ n ");' oder 'puts (" ") hinzu; 'nach Ihrer Schleife (direkt vor' return 0; ') – nos

+0

OK, das hat es behoben! Ich lerne also immer noch viel darüber, wie die Shell funktioniert. Kannst du mir erklären, was passiert ist, oder mich auf eine Ressource hinweisen, die das tut? –

+2

Nun, Sie haben die Zahlen 1 bis 7 ausgedruckt, und dann endete Ihr Programm. Die Shell startet also dort, wo Sie nicht mehr drucken. Wenn Sie vor dem Programmende einen Zeilenumbruch drucken, startet die Shell an einer neuen Zeile, anstatt direkt nach der letzten Nummer 7. – nos

Antwort

0

OK Wie von nos und chqrlie in den Kommentaren hervorgehoben, muss am Ende meines Programms ein Zeilenumbruch hinzugefügt werden, damit die Shell-Eingabeaufforderung nach dem Ende des Programms auf einer neuen Zeile erscheint.

die putchar() Aufruf am Ende des main() Hinzufügen von Fest meiner Frage:

for (i = 0; i < array_length; i++) { 
    printf("%-4d", i + 1); 
    } 

    putchar('\n'); 

    return 0; 
} // end main() 
+1

Sie können auch 'putchar ('\ n');' verwenden, um einen Zeilenumbruch auszugeben. Es hat weniger Overhead als 'printf (" \ n ");'. –

+0

OK, ich werde dies aktualisieren, danke! –

+0

@ JonathanLeffler: Ich bin grundsätzlich einverstanden, aber moderne Compiler erzeugen den gleichen Code für 'printf (" \ n ");', 'puts (" ");' und 'fputchar ('\ n');' – chqrlie

Verwandte Themen