在数组中找到孤立的整数

时间:2015-02-01 16:28:33

标签: c arrays pointers scanf

如果可以,请参阅this hackerrank challenge。

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

问题在于此测试用例

9
4 9 95 93 57 4 57 93 9

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

查看// ------

突出显示的代码部分

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

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

4 个答案:

答案 0 :(得分:1)

您想要使用:

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

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

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

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

之后您所做的事情(int arr[n]; scanf("%d", &n);)非常不合逻辑,因为您在之前将arr声明为n整数的数组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!

答案 1 :(得分:1)

问题n中的1 <= N < 100范围很小,可以使用variable length array。但你在这里做错了

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

在将其用作数组大小

之前,您需要初始化n
scanf("%d", &n);
int arr[n];

答案 2 :(得分:0)

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

如果你在运行时获得数组的大小,那么使用动态内存分配是明智的@ 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

答案 3 :(得分:0)

'n'的值必须在使用之前定义。就像你正在使用

int arr [n];

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

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