2015-02-01 7 views
5

Bitte beziehen Sie sich auf hackerrank Herausforderung, wenn Sie können.Finden Sie die einsame Ganzzahl in einem Array

Das Problem ist, die einsame Ganzzahl in einem Array zu finden, vorausgesetzt, ein Array besteht nur aus Paaren außer einer einsamen Ganzzahl.

Das Problem bei diesem Testfall ist

9 
4 9 95 93 57 4 57 93 9 

9 ist Größe Array und unten ist das Array

Siehe Teil des Codes durch // hervorgehoben ------

Wenn ich scanf ("% d", & n) über den int arr [n] Code setze, funktioniert das gut, aber es gibt schreckliche Ergebnisse umgekehrt. Bitte helfen Sie mir

#include <stdio.h> 

int lonely_integer(int* a, int size); 

int main(){ 
    //n is size of array, i is counter variable 
    int n, i, result; 
    // --------------------- 
    int arr[n]; 
    scanf("%d", &n); 
    // --------------------- 
    printf("%d\n", n); 
    for(i = 0; i < n; i++){ 
     scanf("%d", &arr[i]); 
    } 
    result = lonely_integer(arr, n); 
    printf("%d", result); 
    return 0; 
} 


int lonely_integer(int* a, int size){ 
    int i; 
    int res = 0; 
    for(i = 0; i < size; i++){ 
     res = res^a[i]; 
    } 

    return res; 
} 
+2

Wie kann es wissen, wie groß das Array sein sollte (d. H. Was "n" ist), bevor "n" initialisiert wird? –

+0

Aber warum funktioniert es für 3 Testfälle von 4? – piby180

+2

Bitte denken Sie nur selbst darüber nach: 'int arr [n]; scanf ("% d", &n); 'Sie definieren ein Array der Größe n und n hat den Wert [nichts hier], und dann scannen Sie die Größe ... (BTW: Wenn Sie Kommentare wie:' // schreiben n ist die Größe des Arrays, i ist eine Zählervariable, dann sind Ihre Variablennamen nicht sinnvoll genug, ändern Sie sie in so etwas wie 'counter und size oder arraySize') – Rizier123

Antwort

1

Sie würden verwenden mögen:

#include <stdlib.h> 
/* ... */ 
int *arr; 
scanf("%d", &n); 
arr = malloc(sizeof(int) * n); 

Auf diese Weise arr dynamisch zur Laufzeit zugewiesen wird, so kann es jede Größe auf dem Eingang n abhängig sein.

Was ursprünglich taten (dh arr[n] erklärt nach n über Scanf recieving: scanf("%d", &n); int arr[n];) ist keine gute Idee, weil es den Einsatz von Arrays variabler Länge, eine Funktion von C macht, die nicht zwingend in der aktuellen C Standard.

Sie sehen, arr zur Compile-Zeit erstellt wird, und Sie normalerweise kann es nur initialisieren mit einem konstanten Ausdruck zur Compile-Zeit bekannt, die n, eine Variable als Benutzereingabe empfangen, offensichtlich nicht der Fall. Arrays variabler Länge sind ein Merkmal der Sprache, das es im Grunde erlaubt, diese Regel zu umgehen, d. H. Sie ermöglichen es Ihnen, ein Array auf eine Länge zu initialisieren, die zur Kompilierungszeit nicht bekannt ist. Dies wurde in C99 standardisiert, wurde aber als "optional" ab C11 aufgeführt.

Was du getan hast nach dem (int arr[n]; scanf("%d", &n);) ist ziemlich unlogisch, weil, na ja, Sie arr als ein Array von n ganzen Zahlen erklären vor Sie den Wert n als Benutzereingabe empfangen, und, na ja, seinen Wert kennen. Es Müll druckt, weil n ursprünglich auf eine nicht näher bezeichnete „Müll“ Wert initialisiert wird, und das ist, was Ihre VLA Größe wird, wenn man es erklären:

int arr[n]; //n is garbage at this point, you have no idea how large arr will be! 
scanf("%d", &n); //you got the value of n that you needed, but too late, alas! 
1

Bereich n in der Frage gegeben wird, ist 1 <= N < 100 die klein ist und Ein variable length array kann verwendet werden.Aber Sie tun, ist hier falsch

int arr[n]; // n is uninitialized. Its value is indeterminate. 
scanf("%d", &n); 

Sie müssen n initialisieren, bevor es als Array-Größe

scanf("%d", &n); 
int arr[n]; 
+0

Das ist meine Frage. Warum funktioniert es andersherum, d. H. Wenn wir scanf oben setzen. Zum Zeitpunkt der Kompilierung wissen wir in diesem Fall auch nicht. – piby180

+0

Lesen Sie über Arrays variabler Länge. – haccks

+0

Danke! Ich wusste vorher nichts davon. – piby180

0

Zuweisung von Array mit einer nicht initialisierten Variablen verwenden, wird zu undefinierten Verhalten führen und der Compiler eine Warnung werfen "Variable in dieser Funktion nicht initialisiert verwendet"

Wenn Sie die Größe des Arrays zur Laufzeit erhalten, wäre es ratsam, dynamische Speicherzuweisung als @ Mints97 gebucht

int data_size; 
int *data_array; 
scanf("%d", &data_size); 
data_array = (int*)calloc(data_size,sizeof(int)); 
/* 
. 
*/ 
// Free the memory at the end 
free(data_array); 
data_array = NULL; 

Wenn Sie Größe des Arrays bei der Kompilierung einstellen möchten, können Sie ein Makro

#define DATA_SIZE 9 

oder setzen Sie das Makro definieren, während der Code kompilieren

gcc test.c -o test -DDATA_SIZE=9 -Wall 
+0

Er kompiliert anscheinend mit einem C99-kompatiblen Compiler, also wird sein Array als VLA behandelt. – Mints97

+0

Ja Sridhar, Calloc wird hier eine bessere Option sein. Und danke für deinen Makrotrick. Das ist etwas Neues, das man heute lernen kann. – piby180

0

Wert von ‚n‘ muss definiert werden, bevor es verwendet wurde. Wie Sie verwenden

int arr [n];

vor dem Lesen des Wertes von 'n'. Der Compiler wird also nicht wissen, wie viele Elemente im Array vorhanden sind. N kann ein Garbage-Wert sein. Wie viel Speicher sollte er einem Array zuweisen.

daher müssen Sie den Wert von 'n' lesen, bevor Sie es eine Array-Definition verwenden.

Verwandte Themen