2016-04-28 4 views
1

Ich verstehe, dass einige Funktionen automatisch Zeilenumbrüche an ihre Ausgaben anhängen, aber ich habe ein Szenario gefunden, in dem ein Zeilenumbruch nicht erwartet wird. Ich habe versucht, es zu beheben und zu verstehen, warum es auf viele Arten geschieht, aber ohne Erfolg. Dies ist ein Ausgabeproblem, das ich noch nicht erlebt habe.Unerwartete newline, die unter Verwendung von for-Schleifen, ternären Operatoren und Bedingungen auftritt

Ich mache ein sehr einfaches Projekt von C Programmierung: Ein moderner Ansatz von K.N. King, Kapitel 8, Projekt 6: "B1FF Filter", bei dem bestimmte Zeichen konvertiert und als solche gedruckt werden. Ich benutzte ternäre Operatoren, die mit Bedingungen kombiniert wurden, um die entsprechende Ausgabe zu erhalten. Hier ist das Programm:

/* C Programming: A Modern Approach 
     Chapter 8: Arrays, Project 5: B1FF filter 
*/ 

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

int main(void) 
{ 
    char message[50]; 
    int msg_len; 

    printf("Enter message: "); 
    fgets(message, 50, stdin); 
    msg_len = strlen(message); 

    printf("In B1FF-speak: "); 

    for (int i = 0; i < msg_len; i++) 
    { 
     message[i] = toupper(message[i]); 

     if (message[i] == 'A' || message[i] == 'B') 
      printf("%c", (message[i] == 'A') ? '4' : '8'); 

     else if (message[i] == 'E' || message[i] == 'I') 
      printf("%c", (message[i] == 'E') ? '3' : '1'); 

     else if (message[i] == 'O' || message[i] == 'S') 
      printf("%c", (message[i] == 'O') ? '0' : '5'); 

     else 
      printf("%c", message[i]); 

     if (i == (msg_len - 1)) 
     { 
      for (int j = 0; j < 10; j++) 
       printf("!"); 

      printf("\n"); 
     } 
    } 

    return 0; 
} 

Der Ausgang ist nicht zu erwarten:

Enter message: C is rilly cool 
In B1FF-speak: C 15 R1LLY C00L 
!!!!!!!!!! 

Warum gibt es ein Newline zwischen dem modifizierten String und den Ausrufezeichen? Ich habe eindeutig angegeben, dass die Zeilenumbruch nach dem Drucken aller Text, kurz bevor die Schleife beendet wird auftreten. Ich habe versucht, Änderungen vorzunehmen, z. B. einen Zeilenumbruch außerhalb der Schleife zu drucken und keine for-Schleife für die Ausrufezeichen usw. zu verwenden, aber es führt zu demselben Ergebnis. Es scheint keinen expliziten Grund für sein Auftreten zu geben.

Antwort

2

fgets umfasst die Newline in dem, was es Kopien an die Ziel char Puffer. Daher gibt Ihre Zeichen-zu-Zeichen-Druckroutine es unverändert weiter.

Ergebnis # 1 für fgets auf Google: http://www.cplusplus.com/reference/cstdio/fgets/

Ein Newline-Zeichen macht fgets Stop-Lesung, aber es ist ein gültiges Zeichen von der Funktion betrachtet und in der Zeichenkette kopiert str enthielt.

Natürlich, wie in der anderen Antwort erwähnt, können Sie dies beim Drucken ignorieren oder im Voraus auf Null setzen.

1

fgets() speichert das gelesene Newline-Zeichen im Puffer. Wenn Sie es nicht möchten, entfernen Sie es.

Beispiel:

fgets(message, 50, stdin); 
/* remove newline character */ 
{ 
    char* lf = strchr(message, '\n'); 
    if (lf != NULL) *lf = '\0'; 
} 

Die Bedeutung ist:

fgets(message, 50, stdin); /* read one line from the standard input */ 
/* remove newline character */ 
{ 
    char* lf /* declare a variable */ 
     = strchr(message, '\n'); /* and initialize it with the pointer to the first '\n' in the string message */ 
    if (lf != NULL) /* check if '\n' is found */ 
     *lf = '\0'; /* if found, replace '\n' with '\0' and delete the newline character (and string after '\n', which won't usually present) */ 
} 
+0

@underscore_d Danke, dass für Aufräumen, muss ich die automatisch angefügt Newline in fgets verpasst haben() 's Funktionsreferenz. –

+0

Was genau macht der Code Block Schritt für Schritt? Es hat übrigens perfekt funktioniert, also vielen Dank dafür. Ich möchte nur sicherstellen, dass ich seine Funktionalität verstehe, bevor ich es benutze. –

+0

@GabrielSaul Ich habe eine Erklärung hinzugefügt. – MikeCAT

Verwandte Themen