C101: der beste Weg, um ein Array von Benutzereingaben zu füllen?
Frage
Ich habe eine harte Zeit Verständnis haben und daher Arrays und Indizes manuell in C. Verwaltung Dies sind meine zwei klassische Ansätze, aber sie scheinen nicht zu funktionieren, wie sie halten Looping, wenn der Zustand erreicht ist:
#include<stdio.h>
#define MAX 255
int main(){
int arr[MAX]={0};
int idx=0;
/* Approach #1 */
printf("Enter elements, -1 to finish:\n");
scanf("%d", &arr[idx]);
while(arr[idx-1] != -1 && idx < MAX){
printf("Enter elements, -1 to finish:\n");
scanf("%d", &arr[idx]);
idx++;
}
/* Approach #2 */
do{
printf("Enter elements, -1 to finish:\n");
scanf("%d", &arr[idx]);
idx++;
}while(arr[idx-1] != -1 && idx < MAX);
// Main func continues here.
}
Jede mögliche Beratung sehr geschätzt werden!
Update:
Jetzt funktioniert es! Vielen Dank alle von euch für eine solche sofortige Antworten. Dies ist definitiv eine große Gemeinschaft, es hilft mir sehr.
Lösung
arr[idx] <= MAX
sollte
idx < MAX
, wenn Sie das Element anstelle des Index sind zu überprüfen.
Du bist gerade auch immer das "next" Element für -1 (arr [idx]! = -1), weil Sie idx vor Überprüfung Ihr Mehrwert sind erhöht wird.
Wenn Sie also hatte
arr[idx-1] != -1
Sie wäre in Ordnung.
Andere Tipps
arr[idx] <= MAX
sollte
idx <= MAX
while(arr[idx] != -1 && idx <= MAX){ // Fixed by sklivvz
printf("Enter elements, -1 to finish:\n");
scanf("%d", &arr[idx]);
idx++;
}
Zunächst einmal sollten Sie überprüfen, ob der Index Variabel idx kleiner als MAX (nicht kleiner als oder gleich). Sie würden außerhalb der Grenzen gehen, wenn Ihr Index ist gleich MAX. Ein Array mit MAX = 10 hat Indexwerte 0 bis einschließlich 9, jedoch nicht mehr als 10.
Zweitens, fügen Sie das erste Element zum arr [0], Sie Ihren Index 1 von 0 erhöht, dann springen Sie wieder den while-Zustand und prüfen, ob arr [1] == -1, was es nicht ist . So überprüfen Sie stattdessen, dass arr [idx-1]! = -1. Beachten Sie jedoch, dass das erste Mal, wenn Sie auf die while-Schleife erhalten, werden Sie tatsächlich überprüfen arr [-1]! = -1, die auch außerhalb der Grenzen ist. ;) Also müssen Sie herausfinden, wie diese zu lösen
.Roman M:
Vor allem der Mann die Frage zu stellen hat gerade einen Programmierkurs, gestartet und hat wahrscheinlich noch nicht über Zeiger gelernt. Zweitens geht man nun sowohl mit einem Zähler und einem Zeiger. Ich bin mir nicht sicher, ob ich den Nutzen zu tun, dass im Vergleich zu einem Index wie folgt aus:
für (idx = 0; idx } scanf("%d", &arr[idx]);
if(arr[idx] == -1)
break;
eine for-Schleife verwenden Sie die Notwendigkeit für die chaotisch beseitigen IDX-1 Prüfungscode:
/* Approach #3*/
int i;
int value;
for (i = 0; i < MAX; ++i)
{
printf("Enter elements, -1 to finish:\n");
scanf("%d", &value);
if (value == -1) break;
arr[i] = value;
}
C-Arrays beginnen Zählen von 0
Wenn Sie eine Reihe von Größe MAX zuweisen, das Element am MAX Zugriff wäre ein Fehler. Ändern Sie die Schleife;
int arr[MAX];
for ( .... && idx < MAX )
In Ihrer ersten while-Schleife, die
arr[idx] <= MAX
Zeile sollte
idx <= MAX
In Ihrer zweiten Schleife Sie Inkrementieren idx vor dem Test - es sollte am Ende mit
} while ((arr[idx-1] != -1) && (idx-1 <= MAX));
Ich neige dazu, auch absolut sicher zu sein, nur alle internen Bedingungen klammern, dass der Vorrang korrekt ist (daher die zusätzliche Klammern oben).
ich mit so etwas wie dies gehen würde.
Sie müssen keine Sorgen über Feldgrenzen und andere verwirrende Bedingungen.
int cnt = MAX; // how many elements in the array, in this case MAX
int * p = &arr[0]; // p is a pointer to an integer and is initialize to the address of the first
// element of the array. So now *p is the same as arr[0] and p is same as &arr[0]
// iterate over all elements. stop when cnt == 0
while (cnt) {
// do somthing
scanf("%d", *p); // remember that *p is same as arr[some index]
if (*p == -1) // inspect element to see what user entered
break;
cnt --; // loop counter
p++; // incrementing p to point to next element in the array
}