2016-05-23 14 views
-1
int index = 0; 
FILE *fptr; 
fptr = fopen("File.txt", "w"); 

char arr[] = {'A', '\b', 'B', '\b', 'C', '\b', '\b', '\n'}; 

while(arr[index] != '\0'){ 
    fprintf(fptr, "%c", arr[index++]); 
} 

Hier ist der Ausgang aus der Datei genommen istErklären Sie das seltsame Verhalten von fprintf() im Programm, das Drucken einige ungewöhnliche Zeichen in der Datei

A|BS|B|BS|C|BS||BS| 
hDC2¦v 

Die | BS | ist ein Backspace-Zeichen, das ich aus Gründen der Klarheit so geschrieben habe. Ich kann nicht verstehen, warum die zweite Zeile der Ausgabe angezeigt wird.

Antwort

7

Wenn Sie ein Array mit einer Klammer umschlossen Liste von Initialisierungen wie

char arr[] = {'A', '\b', 'B', '\b', 'C', '\b', '\b', '\n'}; 

es initialisieren ist keine explizite \0 am Ende des Arrays angehängt. So,

while(arr[index] != '\0') 

läuft auf falschen Voraussetzungen und Zugriff außerhalb des gebundenen Speichers. Es ruft undefined behavior auf.

Zitiert C11 Kapitel §6.7.9

Wenn ein Array mit unbekannter Grße initialisiert wird, dessen Größe durch die größte bestimmt wird indexiert Element mit einer expliziten Initialisierer. Der Array-Typ wird am Ende seiner Initialisierungsliste abgeschlossen. wie in jenem Abschnitt erwähnte

Auf der anderen Seite, initialzing stellt ein Array mit einem Stringliteral automatisch den Null-Terminator am Ende

Ein Array von Zeichentyp initialisiert werden kann, durch eine Zeichenkette Literal oder UTF-8 String Literal, optional in geschweiften Klammern. Aufeinander folgende Bytes des Zeichenfolgenliterals (einschließlich , das Nullzeichen beendet, wenn Platz vorhanden ist oder wenn das Array eine unbekannte Größe hat) initialisieren die Elemente des Arrays.

Also, entweder

  • fügen Sie ein \0 als letztes Element der Initialisiererliste
  • oder berechnen Sie die gültige Anzahl der Einträge selbst, wie sizeof(arr)/sizeof(arr[0]) oder ähnliches verwendet wird.
0

Ersetzen while(arr[index] != '\0') mit while(index < sizeof(arr)/sizeof(char))

+0

Es besteht keine Notwendigkeit, durch "sizeof (char)" zu dividieren (ist immer 1) –

+0

Besser zu verwenden 'sizeof arr/sizeof arr [0]' – chux

0

der letzte Wert des Feldelements \n ist. Anstatt also

while(arr[index] != '\0') 

sollten Sie

while(arr[index] != '\n') 

Hinweis verwenden wird kein '\0' Array-Terminator in Ihrem Code.Aber wenn Sie das Array wie diese

char arr[100] = {'A', '\b', 'B', '\b', 'C', '\b', '\b', '\n'}; 

dann die nicht benötigten Elemente nicht explizit definiert definieren, werden auf 0 gesetzt und der Code funktioniert, einschließlich der newline ausgegeben.