3 Stimmen

C-Programmierung. 10 Paare pro Zeile?

Mein Programm muss 10 Paare pro Zeile drucken. Manchmal druckt es jedoch 10 Paare pro Zeile, ein anderes Mal nicht. Ich kann nicht herausfinden, was ich falsch mache. Ich habe das Buchkapitel zweimal gelesen. Ich verstehe, wie der Modulbetrieb funktioniert, aber es sieht so aus, als ob ich ihn hier nicht sehr gut anwenden kann. Was übersehe ich hier?

Dies habe ich geschrieben:

Ich würde gerne wissen, warum nicht immer 10 Paare pro Zeile gedruckt werden.

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

int main(void)
{
int ch;
int i=0; /* counter */

printf("Please enter some characters.\n\n");

while((ch=getchar()) != EOF)
{
if((i%10) == 0)
    putchar('\n');   /*printf("\n); */

if (ch == '\n')
    printf( "\n\\n ");
else if (ch == '\t')
    printf("\\t %d ", ch);
else if (ch < ' ')
    printf("^%2c %3d  ", ch+64, ch);
else
    printf("%2c %3d  ",ch, ch);

i = i+1;
}
return 0;
}

2voto

paxdiablo Punkte 809679

Ich glaube, Ihr Problem liegt hier:

if (ch == '\n')
    printf( "\n\\n ");

Wenn Sie auf einen Zeilenumbruch in Ihrer Eingabe stoßen, geben Sie einen Zeilenumbruch gefolgt von den Zeichen \ y n .

Aber was Sie nicht tun ist anpassen i um anzuzeigen, dass Sie eine neue Zeile begonnen haben. Wenn also der erste Zeilenumbruch das fünfte Zeichen ist, i ist immer noch 5 und in der nächsten Zeile stehen weniger als zehn Zeichen.

Außerdem denke ich, dass Sie immer noch die ASCII-Codes für Zeilenumbruch und Tabulator ausgeben wollen, und die Formatierung muss überarbeitet werden.

Das nachstehende Beispiel dient nur zu Ihrer Information. Wenn Sie es plagiieren, werden Sie wahrscheinlich schnell enttarnt, also lesen Sie es und verstehen Sie es. Kopieren Sie es nicht blindlings.

#include <stdio.h>

int main (void) {
    int ch;
    int i = 0;

    printf("Please enter some characters.\n");

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

Bis jetzt ist das so ziemlich dasselbe wie bei dir, jetzt wird es ein bisschen anders. Anstatt i % 10 == 0 werden einfach die Zahlen von 0 bis einschließlich 9 durchlaufen. So gibt es keine Probleme mehr, wenn die Eingabe mehr als zwei Milliarden Zeichen enthält :-)

        // Ten characters printed? Newline and adjust count.

        if(i == 10) {
            putchar('\n');
            i = 0;
        }

Die einzige wirkliche Änderung ist nun die Formatierung und die Aktionen für Zeilenumbrüche. Es muss am Ende mit i nach dem Druck auf Null gesetzt wird, so dass eine Kombination aus dem Zeilenumbruch-spezifischen i = -1 y el i++ darunter, die jeder Fall durchläuft, wird das tun:

        // Handle each case.

        if (ch == '\n') {
            // Newline? Print and reset to 0 (after i++ below).

            printf( "\\n %3d\n", ch);
            i = -1;
        } else if (ch == '\t')
            // Tab? Just print tab symbol.

            printf("\\t %3d  ", ch);
        else if (ch < ' ')
            // Control character? Print ^X.

            printf("^%c %3d  ", ch+64, ch);
        else
            // Otherwise just print character as is.

            printf("%2c %3d  ", ch, ch);

        // Increment count.

        i++;
    }
    return 0;
}

Ein Probelauf:

pax> echo 'This
...> input crosses many lines, some larger than ten,
...> some smaller.' | ./testprog
Please enter some characters.
 T  84   h 104   i 105   s 115  \n  10
 i 105   n 110   p 112   u 117   t 116      32   c  99   r 114   o 111   s 115  
 s 115   e 101   s 115      32   m 109   a  97   n 110   y 121      32   l 108  
 i 105   n 110   e 101   s 115   ,  44      32   s 115   o 111   m 109   e 101  
    32   l 108   a  97   r 114   g 103   e 101   r 114      32   t 116   h 104  
 a  97   n 110      32   t 116   e 101   n 110   ,  44  \n  10
 s 115   o 111   m 109   e 101      32   s 115   m 109   a  97   l 108   l 108  
 e 101   r 114   .  46  \n  10

2voto

Aaron Dufour Punkte 16700

Das Problem ist, dass Sie, wenn Sie eine neue Zeile beginnen, wenn Sie ein Zeilenumbruchzeichen finden, nicht zurücksetzen i . Ich würde die folgende Änderung vorschlagen:

if(char == '\n')
{
    printf("\\n  10  ");
    i = -1;
}

En i = -1; setzt den Zähler zurück; dabei wird berücksichtigt, dass er am Ende der Schleife inkrementiert wird ( i = 0; continue; würde auch funktionieren). Jetzt werden alle Zeilenumbrüche von der Prüfung auf i%10==0 also habe ich den Zeilenumbruch aus der printf . Ich habe auch den ASCII-Code für die '\n' damit es den Spezifikationen entspricht.

Ein paar andere Änderungen würde ich vornehmen:

Wenn Sie die Schrittweite auf i = (i + 1) % 10 eliminieren Sie die geringe Möglichkeit, dass i überquillt.

Wenn Sie das Tabulatorzeichen ausdrucken, brauchen Sie keine Formatierung zu verwenden, um den ASCII-Code zu drucken;

printf("\\t   9  ");

tut das Gleiche und kann etwas schneller sein, je nachdem, wie gut Ihr Compiler es optimiert.

Um sicherzustellen, dass die Dinge beim Drucken gut ausgerichtet sind, würde ich nicht druckbare Zeichen mit

printf("^%1c %3d  ", ch+64, ch);

Dies ist eine rein ästhetische Frage.

0voto

Joop Eggen Punkte 101784

Nicht zu vergessen: nach der Schleife:

if((i%10) == 0)
    putchar('\n');   /*printf("\n); */

Der Fehler ist:

printf( "\n\\n ");

Sollte sein:

printf( "\\n ");

Gefolgt von:

else if (ch < 32) {
    if (1 <= ch && ch <= 26) {
        printf("Ctrl+%c ", 'A' - 1 + ch);
    } else {
        printf("Ctrl+%c ", 'A' - 1 + ch); // Whatever
    }
}

Besonders unter Windows ` \r ' auftreten könnte.

0voto

everconfusedGuy Punkte 2559

Wenn in der Eingabe selbst ein Zeilenumbruch vorkommt, gibt das Programm ein neues online aus. Auf diese Weise kann es sein, dass nicht immer 10 Zeichen in der Ausgabe stehen.

-1voto

matt Punkte 31

Ihr Programm druckt die Leerzeichen, während es läuft ~Sie sollten die else if-Anweisung hinzufügen, um das Leerzeichen zu überspringen~ der Code sollte wie folgt aussehen~

else if(ch == ' ')
continue;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X