Domanda

Possibile duplicato:
NUL termina un array int

Sto cercando di stampare tutti gli elementi in un array:

int numbers[100] = {10, 9, 0, 3, 4};
printArray(numbers); 

Usando questa funzione:

void printArray(int array[]) {
    int i=0;
    while(array[i]!='\0') {
        printf("%d ", array[i]);
        i++;
    }
    printf("\n");
}

Il problema è che ovviamente C non distingue solo un altro elemento zero nell'array e la fine dell'array, dopo di che è tutto 0 (notato anche 0).

Sono consapevole che non c'è differenza grammaticamente tra 0 e 0, quindi stavo cercando un modo o hack Per realizzare questo:

10 9 0 3 4

Invece di questo

10 9

L'array potrebbe anche apparire così: {0, 0, 0, 0} Quindi ovviamente l'output deve ancora essere 0 0 0 0.

Qualche idea?

È stato utile?

Soluzione

Non terminare un array con un valore che potrebbe anche essere nell'array.

Devi trovare un UNICO Terminator.

Dato che non hai indicato numeri negativi nel tuo array, ti consiglio di terminare con -1:

int numbers[100] = {10, 9, 0, 3, 4, -1};

Se questo non funziona, considera: INT_MAX, o INT_MIN.

Come ultima risorsa, codice a sequenza di valori garantiti non essere nel tuo array, come ad esempio: -1, -2, -3 che indica la risoluzione.

Non c'è niente di "speciale" nel terminare con 0 o \0. Termina con qualunque cosa funzioni per il tuo caso.


Se il tuo array può davvero contenere tutti i valori in qualsiasi ordine, allora un terminator non è possibile e lo farai avere Per tenere traccia della lunghezza dell'array.

Dal tuo esempio, questo sarebbe:

int numbers[100] = {10, 9, 0, 3, 4};
int Count = 5;
int i;

for(i=0; i<Count; ++i)
{
    // do something with numbers[i]
}

Altri suggerimenti

I modi tipici per implementarlo sono per:

  • Definisci un valore sentinella (che altri hanno suggerito)
  • Definire una struttura con un int (il valore effettivo) e un bool (che indica se è il sentinella) e crea invece un array di quelli
  • Passare la lunghezza dell'array con l'array
  • Definire una struttura che contiene sia l'array che la lunghezza e passa invece

Si noti che i primi e i secondi elementi sono quasi identici.

Per un array dichiarato come

int numbers[100] = {10, 9, 0, 3, 4};

Non c'è assolutamente modo di distinguere l'esplicito 0 Nell'inizializzatore dagli zeri impliciti utilizzati per inizializzare la porzione di coda dell'array. Sono gli stessi zeri. Quindi, ciò che vuoi fare non può essere fatto letteralmente.

L'unico modo in cui puoi farlo è selezionarne alcuni int Valore come valore terminale dedicato riservato e aggiungilo sempre alla fine dell'array esplicitamente. Cioè se lo scegli -42 Come valore Terminator, dovresti dichiararlo come

int numbers[100] = {10, 9, 0, 3, 4, -42};

e itera fino al primo -42 nei tuoi cicli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top