Trouver l’entier solitaire dans un tableau

S’il vous plaît se référer à ce défi hackerrank si vous le pouvez.

Le problème est de trouver l’entier solitaire dans un tableau, puisqu’un tableau ne contient que des paires, à l’exception d’un entier solitaire.

Le problème est avec ce cas de test

9 4 9 95 93 57 4 57 93 9 

9 est la taille du tableau et ci-dessous est le tableau

Voir la partie de code surlignée par // ——

Si je place scanf (“% d”, & n) au-dessus de int arr [n], le code fonctionne bien, mais donne des résultats horribles dans l’autre sens. Sil te plait aide moi

 #include  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; } 

Vous voudriez utiliser:

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

De cette façon, arr est alloué dynamicment au moment de l’exécution, de sorte qu’il puisse être de n’importe quelle taille en fonction de l’entrée n .

Ce que vous faisiez à l’origine (c’est-à-dire déclarer arr[n] après avoir reçu n via scanf: scanf("%d", &n); int arr[n]; ) n’est pas une bonne idée car il utilise des tableaux de longueur variable , une fonctionnalité de C qui n’est pas obligatoire dans la dernière norme C.

Vous voyez, arr est créé au moment de la compilation, et vous ne pouvez normalement l’ initialiser qu’avec une expression constante connue au moment de la compilation, ce que n , une variable reçue comme entrée utilisateur, n’est évidemment pas. Les tableaux de longueur variable sont une fonctionnalité du langage qui vous permet fondamentalement de contourner cette règle, c’est-à-dire qu’ils vous permettent d’initialiser un tableau à une longueur inconnue au moment de la compilation. Cela a été standardisé en C99 , mais a été répertorié comme “facultatif” à partir de C11 .

Ce que vous avez fait par la suite ( int arr[n]; scanf("%d", &n); ) est assez illogique car, bien, vous déclarez arr comme un tableau de n entiers avant de recevoir la valeur de n comme entrée utilisateur, et bien, connaissez sa valeur. Il imprime garbage car n est initialisé à une valeur “garbage” non spécifiée, et voici la taille de votre VLA lorsque vous le déclarez:

 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! 

La plage de n indiquée dans la question est 1 <= N < 100 ce qui est petit et un tableau de longueur variable peut être utilisé. Mais vous vous trompez ici

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

Vous devez initialiser n avant de l’utiliser comme taille de tableau

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

L’allocation d’un tableau avec une variable non initialisée entraînera un comportement indéfini et le compilateur lancera un avertissement “variable utilisée non initialisée dans cette fonction”

Si vous obtenez la taille d’un tableau au moment de l’exécution, il serait sage d’utiliser l’allocation de mémoire dynamic telle que @ Mints97 publiée.

 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; 

Si vous voulez définir la taille du tableau au moment de la compilation, vous pouvez définir une macro

 #define DATA_SIZE 9 

ou définir la macro lors de la compilation du code

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

La valeur de ‘n’ doit être définie avant son utilisation. Comme vous utilisez

int arr [n];

avant de lire la valeur de ‘n’. Ainsi, le compilateur ne saura pas que le nombre d’éléments présents dans le tableau ‘n’ peut être une valeur erronée. Quelle quantité de mémoire il doit allouer à un tableau.

par conséquent, vous devez lire la valeur de ‘n’ avant de l’utiliser comme définition de tableau.