Wenn das letzte Zeichen mit dem ersten Zeichen des nächsten Elements des Arrays übereinstimmt, wird die Ausgabe mit dem letzten Zeichen wiederholt. Was ist der Grund und was sollte die Lösung sein?

Left side is program right side is output

#include <stdio.h>

int main(void) {
  int i ;

  char fact_char[13][2] = {"I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"};

  for(i = 0; i < 13; i++){
    printf("%s\n", fact_char[i]);
  }

  return 0;
}

AUSGABE


I
IVV
V
IXX
X
XLL
L
XCC
C
CDD
D
CMM
M

2
Aziz Ahmed 21 Feb. 2020 im 23:24

3 Antworten

Beste Antwort

Zeichenfolgen in c sind nullterminiert. Um "IV" darzustellen, speichern Sie tatsächlich "I", "V" und "\ 0" im Speicher. Wenn Sie eine Zeichenfolge mit zwei Zeichen drucken, schreibt printf so lange, bis der nächste Nullterminator im Speicher gefunden wird, der sich zufällig in der nächsten Zeichenfolge (Einzelzeichen) befindet.

Um dies zu beheben, machen Sie es einfach

Fact_char [13] [ 3 ]

6
yhyrcanus 21 Feb. 2020 im 20:28

printf("%s\n", fact_char[i]); erwartet, dass fact_char[i] eine Zeichenfolge ist.

Eine Zeichenfolge ist eine zusammenhängende Folge von Zeichen, die mit dem ersten Nullzeichen abgeschlossen sind und dieses enthalten. C18

fact_char[11] ist keine Zeichenfolge , da es kein Nullzeichen gibt. Es ist nur 'C', 'M'.

Lassen Sie entweder mehr Platz mit fact_char[13][3] oder drucken Sie mit einer Breitenbeschränkung. Im Folgenden wird der Druckvorgang nach 2 Zeichen oder bis zum Auftreten eines Nullzeichens beendet. fact_char[11] ist immer noch keine Zeichenfolge , da es kein Nullzeichen gibt.

printf("%.2s\n", fact_c[i]); // limit print width
1
chux - Reinstate Monica 22 Feb. 2020 im 06:03

Ihre Array-Deklarationen lassen keinen Platz für die Null-Terminatoren der 2-Buchstaben-Zeichenfolgen. Ändern Sie es in

char fact_char[13][3]

Die Verwendung des Formats %s zum Drucken eines Arrays char ohne Nullterminator führt zu undefiniertem Verhalten.

5
Barmar 21 Feb. 2020 im 20:30