【问题标题】:C program not entering any for loops?C程序没有进入任何for循环?
【发布时间】:2014-04-06 22:58:45
【问题描述】:

这是家庭作业

我的程序似乎根本没有进入任何 for 循环。有一次,我在main 中拥有每个函数,并且对 2 个全局变量进行操作,而无需通过引用或值传递,并且一切正常。从那时起,我将我的函数移出main 并通过引用传递一个数组,并将该数组的长度传递给每个函数,我得到printf 循环之外的语句,但除此之外没有任何执行。

根据 GDB,我的程序以退出代码 046 退出。

程序很简单,它将一个值设置为我的数组的长度,然后提示用户输入整数值来填充该数组。然后我对数组进行排序,然后打印数组,最后调用getMax(int *array, int n) 将最大值打印到屏幕上。

输出的一个例子是:

Enter the number of elements to be sorted:
3
Enter 10 integers in any order:
2
1
4
Inside sortArray
Inside sort and print
inside setMAx
The largest value in the array is: 0

我好像弄坏了什么东西,我不应该弄乱它。这是我的尝试。

感谢您的帮助,我会坐在这里寻找我的错误。

#include <stdio.h>

void printArray (int *array, int n);
void sortArray (int *array, int n);
void fillArray (int *array, int n);
void getMax (int *array, int n);

int main(void){

    int array[10],n = 0;

    fillArray  (array, n);
    sortArray  (array, n);
    printArray (array, n);
    getMax     (array, n);

    return 0;
}

void sortArray(int *array,int n){
   printf("Inside sortArray\n");

   int temp, c = 0, c2;
   for(c=0;c<n;c++){
        printf("inside for loop SA\n");
        for(c2=c;c2<n;c2++){ 
            if(array[c]>array[c2]){
            temp=array[c];
            array[c]=array[c2];
            array[c2]=temp;
            }
        }
    }
}

void printArray (int *array, int n){
    int c = 0;
    printf("Inside sort and print\n");
    for(c=0;c<n;c++){
            printf("\t%d",array[c]);
    }
    printf("\n");
}

void fillArray (int *array, int n){
    int c = 0;
    printf("Enter the number of elements to be sorted:\n");
    scanf("%d",&n);
    printf("Enter 10 integers in any order: \n");
    for(c=0;c<n;c++){
        scanf("%d", &array[c]);
    }
}

void getMax (int *array, int n){
    printf("inside setMax\n");
    int temp = 0, i = 0;

    for (i = 0;i<n;i++){
        printf("temp: %d", temp);
        if(array[i]>temp)
        temp=array[i];
    }    
    printf("\nThe largest value in the array is: %d\n", temp);
}

【问题讨论】:

    标签: c arrays function scope pass-by-pointer


    【解决方案1】:

    n 的地址传递给fillArray() 函数,以便在main() 中获得用户想要输入的元素数量。

    称之为

    fillArray  (array, &n);
    

    定义为

    void fillArray (int *array, int *ptr_n){
        int c = 0, n =0;
        printf("Enter the number of elements to be sorted:\n");
        scanf("%d",&n);
        printf("Enter 10 integers in any order: \n");
        for(c=0;c<n;c++){
            scanf("%d", &array[c]);
        }
        //set ptr_n
        *ptr_n = n;
    }
    

    您也可以从fillArray() 返回n,而不是为其传递指针。

    n = fillArray  (array, n);
    

    定义为

    int fillArray (int *array, int n){
        int c = 0;
        printf("Enter the number of elements to be sorted:\n");
        scanf("%d",&n);
        printf("Enter 10 integers in any order: \n");
        for(c=0;c<n;c++){
            scanf("%d", &array[c]);
        }
        return n;
    }
    

    【讨论】:

      【解决方案2】:

      void fillArray (int *array, int n) 不会更新n 的值。您应该将 n 作为指针传递,给 fillArray 以下签名:void fillArray (int *array, int *n)

      然后,在fillArray 中,您可以使用*n 来修改它的值,或者使用n 而不是&amp;n

      最后,当调用fillArray 时,你会用&amp;n 调用它。

      【讨论】:

      • 或在return 语句中返回n 的值,并更改fillArry() 函数的类型,使其返回int
      • 这两个答案都对我有帮助,但我遇到了另一个问题,再次阅读这个答案也为我解决了这个问题,所以这是我选择的。感谢大家!我已经修复成功了。
      【解决方案3】:

      您将主函数中的 n 传递给初始化为 0 的所有其他函数。所以没有一个循环在工作,因为当你用 n 检查它时它会失败并退出循环。

      在函数内部声明的变量(包括声明为参数变量)仅对该函数是局部的。

      您在fillArray 中读取的值 n 仅在函数处于作用域内时才有效。 它不会反映回主函数 n(两者都是不同的变量)。

      您可以在主程序中读取 n 的值,然后将其传递给其他函数。

      如果您了解指针概念,您可以在 fillArray 中使用它,以便 n 反映在 main 中。

      void fillArray (int *array, int *n)

      主要

      fillArray (array, &amp;n);

      在 scanf 中阅读时使用 n 而不是 &amp;n 和 for 循环中 *n

      【讨论】:

        【解决方案4】:

        您通过值将n 指向fillArray,并使用0 简单地初始化n 的本地副本,因此当您退出该函数时,您的n 仍保留在主函数中的0。您通过引用获得路径n

          void fillarray(.... int* n)
          {
        
               ....
               scanf("%d",n);
          }
        

        或者更好的是直接从fillarray返回n

          n = fillarray(int *array)
        

        【讨论】:

          猜你喜欢
          • 2021-12-12
          • 1970-01-01
          • 2011-09-22
          • 2011-09-30
          • 1970-01-01
          • 1970-01-01
          • 2013-11-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多