在数组中找到孤立的整数

如果可以的话,请参考这个 hackerrank挑战。

问题是在数组中找到孤立的整数,给定一个数组只包含一对,除了一个孤独的整数。

问题出在这个测试用例上

9 4 9 95 93 57 4 57 93 9 

9是数组大小,下面是数组

查看// ——突出显示的代码部分

如果我将scanf(“%d”,&n)置于int arr [n]代码上方工作正常,但反过来会产生可怕的结果。 请帮帮我

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

你想要使用:

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

这样, arr在运行时动态分配,因此它可以是任何大小,具体取决于输入n

你最初做的事情(即通过scanf接收n后声明arr[n]scanf("%d", &n); int arr[n]; )不是一个好主意,因为它使用了可变长度数组 , C的一个特征,在最新的C标准中不是强制性的。

你看, arr是在编译时创建的,你通常只能用编译时已知的常量表达式初始化它, n ,一个变量作为用户输入接收,显然不是。 可变长度数组是该语言的一个特性,它基本上允许您绕过此规则,即它们使您能够将数组初始化为编译时未知的长度。 这已在C99标准化 ,但在C11中被列为“可选”。

之后你做了什么( int arr[n]; scanf("%d", &n); )是非常不合逻辑的,因为你收到n的值作为用户输入之前 ,你将arr声明为n整数的数组,而且,知道它的价值。 它会打印垃圾,因为n最初初始化为未指定的“垃圾”值,这是您声明它时VLA的大小:

 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! 

在问题中给出n范围是1 <= N < 100 ,这是小的并且可以使用可变长度arrays 。 但你在这里做错了

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

在将其用作数组大小之前,需要初始化n

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

使用未初始化的变量分配数组将导致未定义的行为,编译器将抛出警告“在此函数中使用未初始化的变量”

如果你在运行时获得数组的大小,那么使用@ Mints97发布的动态内存分配是明智的

 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; 

如果要在编译时设置数组大小,可以定义宏

 #define DATA_SIZE 9 

或者在编译代码时设置宏

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

‘n’的值必须在使用之前定义。就像你正在使用的那样

int arr [n];

在读取’n’的值之前。 所以编译器不会知道,数组’n’中存在多少个元素可能是一个垃圾值。它应该为数组分配多少内存。

因此在使用数组定义之前,你必须读取’n’的值。