2016-03-28 17 views
-1

Ich bin neu in der Codierung, also entschuldige ich mich, wenn dies eine dumme Frage ist. Ich schreibe Werte in ein Array, so dass die Position in dem Array dem Wert entspricht, so dass die erste Position in dem Array 1 ist, die zweite Position in dem Array 2 ist, die n-te Position in dem Array einen Wert von n hat. Dieser Code funktioniert, bis Sie Eingabe 8.Array Länge in C

#include <stdio.h> 

int a = 0, b = 0; 

int main(void){ 
    int die[b]; 
    printf("Input how many sides your die has \n"); 
    scanf("%i", &b);  
    for(a = 1; a <= b; a++){ 
     die[a] = a; 
    }  
    for(a = 1; a <= b; a++){ 
     printf("%i ", die[a]); 
    } 
} 

jedoch dieser Code funktioniert für jeden beliebigen Wert eingegeben ....

#include <stdio.h> 

int a = 0,b = 0; 

int main(void){ 
    printf("Input how many sides your die has \n"); 
    scanf("%i", &b); 
    int die[b]; 
    for(a = 1; a <= b; a++){ 
     die[a] = a; 
    } 
    for(a = 1; a <= b; a++){ 
     printf("%i ", die[a]); 
    } 
} 

Meine Frage ist, warum die Position des Scanf nicht ändern, und die Deklaration des Arrays ändern die Art, wie der Code so viel funktioniert?

+1

Arrays in C sind * zero-indexed * (zB beginnen sie bei '0'), also schreiben Sie vom zweiten Element' 1' nach * 1-nach dem Ende Ihres Arrays * mit 'for (a = 1; a <= b; a ++); sterben [a] = a'. Sagen Sie, wenn der Benutzer "6" eingibt, sind Ihre gültigen Elemente "0-5". In Ihrem Fall müssten Sie Ihren Index anpassen (zB 'für (a = 0; a

Antwort

3

Beide Codebeispiele führen zu undefiniertem Verhalten. Der Array-Index sollte von 0 beginnen. Ihre Schleife sollte wie folgt sein:

for(a=0; a < b; a++){ 

In Ihrem ersten Codebeispiel int die[b]; b auf 0 Sein initialisiert wird erst nach dem Scanf es zu benutzerdefinierten Eingabe initialisiert wird.

Auch der Formatbezeichner für int s ist %d.

0

Der erste Code führt tatsächlich zu undefiniertem Verhalten. Der Grund ist, dass Sie eine globale Variable b initialisieren, die auf 0 initialisiert wird, und dann erstellen Sie ein lokales Array die[b], vor Lesen eines Werts vom Benutzer. So wird Ihr Array tatsächlich mit dem Wert 0 für b erstellt und als die[0] deklariert, mit anderen Worten, es ist ein Array der Größe 0. (Eigentlich, auch wenn Sie b mit scanf() lesen, das ist eine andere Variable von dem globalen b Sie erklärt haben.)

In Ihrem zweiten Code, Sie brauchen nicht auf die globale Variable b. Machen Sie es lokal und lesen Sie es vom Benutzer wie Sie.

  • Darüber hinaus beim Drucken Ganzzahlen verwenden Sie den Spezifizierer %d.
  • Beginnen Sie abschließend mit der Indexierung Ihres Arrays von 0, nicht von 1.
0

Ja, Position scanf wird das Verhalten des Codes, da in dem ersten Code-Wert von b wird 0 ändern, und das ist, warum Ihr Array wie die[0] und in dem zweiten Codewert von b wird eingegeben initialisiert wird Benutzer deshalb wird Array basierend auf dem Benutzerwert initialisiert.

0

Array-Index starten von 0 anstelle von 1.

Sie können Werte wie folgt in ein Array eingeben.

for(a = 0; a < b; a++) { 
    die[a] = a; 
} 

Und Sie nehmen Ausgabe von Array in ähnlicher Weise.

0
int die[b]; 

printf("Input how many sides your die has \n"); 
scanf("%i",&b); 

hier zunächst b ist 0. So erklären Sie Array der Größe 0. Es ist eigentlich nicht definiertes Verhalten zu bekommen. Aber

printf("Input how many sides your die has \n"); 
scanf("%i",&b); 


int die[b]; 

hier, bringen Sie zunächst Wert von b. Und dann erklärte Array der Größe, dass b .Aber noch wird es nicht definiertes Verhalten zeigen, wie Sie versuchen, Chip zugreifen [b], wo man rechts von sterben auf Zugang [0] bis die [b-1] (Gesamtgröße b).

1

Alle oben genannten Antworten haben bereits gesagt, dass Ihr Code zu einem undefinierten Verhalten führt. Will um die Dinge weiter zu klären. Grundsätzlich ist Ihr Array eine lokale Variable mit statischer Größe. Also wird es auf Stapel zugewiesen. Wenn Sie also int arr [b] sagen, während b zur Kompilierzeit null ist, wird arr [0] auf dem Stack zugewiesen. Der Scanf funktioniert zur Laufzeit. Wenn Sie also einen Wert in 'b' scannen, der nicht in den Stapel zurückgeht und die Größe des Arrays ändert. Wenn Sie also ein dynamisches Array wünschen, also ein Array zur Laufzeit zuordnen, könnte Ihnen der folgende Code am besten dienen.

int a = 0, b = 0; 
int main() 
{ 
int* arr = NULL; 
printf("How many sides does your dice has?\n"); 
scanf("%d", &b); 

arr = malloc(sizeof(int)*b); 

for(a = 0; a < b; a++) 
{ 
    arr[a] = a; 
} 
} 
+0

Richtig! Variablenvariable variabler Länge, die sich zur Laufzeit nicht ändert +1. – user2728397

0

Sie sollten immer über den Umfang nachdenken, wenn Sie die Variablen deklarieren. Unten Punkte können Sie versuchen:

  1. Die Variablen a und b lokale Variablen sein sollte.

  2. Sie müssen über dynamische Speicherzuweisung in C lernen. Wie ich sehen kann, dass Sie nach scanf() ein Array von gescannten Größe erstellen möchten. Dies ist ein Anwendungsfall der dynamischen Speicherzuweisung. Sie müssen also malloc verwenden, um ein Array der gewünschten Größe zuzuweisen.

Nachdem diese Korrekturen Ihr Programm anwenden will rock :) und nicht vergessen free den Speicher - Als guten Programmierstil.