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
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
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? –
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