如何避免使用全局变量?

时间:2018-11-24 17:32:12

标签: c

我有要运行的程序:

void get_set(int size, int arr[])
{
    int i;
    printf("Enter number of values to the array : \n");
    scanf("%d", &size);
    printf("\n");
    for (i = 0; i < size; i++)
    {
        printf("Value at %dth place is : \n", i + 1);
        if (scanf("%d", &arr[i]) == EOF)
        {
            break;
        }
    }
}

void print_set(int size, int arr[])
{
    int i, flag = 0;
    if (flag == 0)
    {
        printf("\nOriginal array is : ");
        for (i = 0; i < size; i++)
        {
            printf("%d,", arr[i]);
        }
        printf("\n");
    }
    else
    {
        printf("\nArray after deleting duplicates : ");
        for (i = 0; i < size; i++)
        {
            printf("%d,", arr[i]);
        }
        printf("\n");
    }
    flag + 1;
}

void RemoveDuplicates(int size, int arr[])
{
    int i, j, k;
    for (i = 0; i < size; i++) 
    {
        for (j = 0; j < i; j++) 
        {
            if (arr[i] == arr[j]) 
            {
                size--;
                for (k = i; k < size; k++) 
                {
                    arr[k] = arr[k + 1];
                }
                i--;
            }
        }
    }
}

int main()
{
    int size = 0;
    int arr[64] = {0};
    get_set(size, arr);
    print_set(size, arr);
    RemoveDuplicates(size, arr);
    print_set(size, arr);
    return 0;
}

简而言之,该程序获取一个具有我输入的值的数组,并将其传递给其他函数。 我无法将数组和大小传递给其他函数。我试图避免全球化。我在做什么错了?

2 个答案:

答案 0 :(得分:1)

size中的main变量按值传递给get_set,因此它仍将是0中的main。您应该让get_set返回大小并将结果分配给size变量(或通过引用传递size),以便可以将其传递给print_set和{{1 }}。

RemoveDuplicates实际上并不需要get_set作为参数,除非您更改它的意思是表示数组的容量并添加错误检查以确保您不会溢出它。< / p>

size变量是通过引用传递的,因为它是一个衰减为指针的数组,因此arr将修改get_set中的变量。

答案 1 :(得分:0)

您可以使用:

#include <stdio.h>
#include <stdlib.h>

static int get_set(int size, int arr[])
{
    int i;
    int n;
    printf("Enter number of values to the array: ");
    fflush(stdout);      // Usually not strictly necessary, but ensures the prompt appears
    if (scanf("%d", &n) != 1)
    {
        fprintf(stderr, "Invalid number entered\n");
        exit(EXIT_FAILURE);
    }
    if (n > size)
        n = size;
    printf("\n");
    for (i = 0; i < n; i++)
    {
        printf("Value %d is: ", i + 1);
        fflush(stdout);
        if (scanf("%d", &arr[i]) != 1)
        {
            break;
        }
    }
    return i;
}

static void print_set(const char *tag, int size, int arr[])
{
    int i;
    printf("\n%s: ", tag);
    for (i = 0; i < size; i++)
    {
        printf("%d,", arr[i]);
    }
    printf("\n");
}

static int RemoveDuplicates(int size, int arr[])
{
    int i, j, k;
    for (i = 0; i < size; i++) 
    {
        for (j = 0; j < i; j++) 
        {
            if (arr[i] == arr[j]) 
            {
                size--;
                for (k = i; k < size; k++) 
                {
                    arr[k] = arr[k + 1];
                }
                i--;
            }
        }
    }
    return size;
}

int main(void)
{
    int arr[64] = {0};
    int size = get_set(64, arr);  // 64 is the maximum; size contains the actual
    print_set("Original array", size, arr);
    size = RemoveDuplicates(size, arr);
    print_set("Duplicates removed", size, arr);
    return 0;
}

main()以外的任何函数均未从该文件外部调用;因此,这些功能都可以是静态的。

示例运行:

Enter number of values to the array: 12

Value 1 is: 1
Value 2 is: 1
Value 3 is: 1
Value 4 is: 2
Value 5 is: 2
Value 6 is: 3
Value 7 is: 4
Value 8 is: 5
Value 9 is: 99
Value 10 is: 999
Value 11 is: 1
Value 12 is: 1

Original array: 1,1,1,2,2,3,4,5,99,999,1,1,

Duplicates removed: 1,2,3,4,5,99,999,

print_set()函数的另一种重新设计将使原始代码中的flag变成static int。但是,这比将标签字符串参数传递给函数的灵活性要差得多。函数中的静态变量有时会有用,但是应该以黄疸的眼光来看待它们,并且应尽可能避免使用,就像应尽可能避免使用全局变量一样。