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.
@underscore_d Danke, dass für Aufräumen, muss ich die automatisch angefügt Newline in fgets verpasst haben() 's Funktionsreferenz. –
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. –
@GabrielSaul Ich habe eine Erklärung hinzugefügt. – MikeCAT