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.

War es hilfreich?

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
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top