数组分配后scanf挂起... 0.o?

约翰·康纳

我运行此代码,并要求用户输入,然后在它开始将所有这些数字输入到数组位置时挂起,因此在此处进行了一些测试,以帮助我找出导致挂起的原因。我不知道。这要么非常简单,要么就与我的编译器(代码:: Blocks)一起实现。

    // Chapter 9 Programming Project #1

    #include <stdio.h>

    #define N 10

    void selection_sort(int n, int a[]);

    int main(void)
    {
        int i, a[N];

        printf("Enter a series of integers: ");
        for (i = 0; i < N; i++) {
            scanf("%d", &a[i]);
            printf("Scanf Test #%d and %d\n", i, a[i]);
        }

        printf("Scanf Test\n");
        selection_sort(N - 1, a);

        // iterate through array
        for (i = 0; i < N; i++) {
            printf("%d ", a[i]);
        }
        printf("\n");

        return 0;
    }

    void selection_sort(int n, int a[n])
    {
        // Search for the highest value
        // Place that value at the end
        // Call the function with the end of the array removed
        // Create a way for it to break the cycle
        int i, temp, high = n;
        printf("Function Called\n");
        for (i = 0; i < n; i++) {
            printf("Test: %d", i);
            if (a[i] > a[high]) {
                temp = a[high];
                a[high] = a[i];
                a[i] = temp;
                printf("Test Pass: %d\n", i);
                if (n - 1 > 1)
                    selection_sort(n - 1, a);
            }
        }
    }

注意::该程序会Scanf Test #0 and 1反复打印,直到最后一个数字已分配给它在a[i].....中的位置,其中#0 and 1,1是用户输入的第一个数字

编辑:为消除混乱,如果用户仅输入1个数字为“ 1”,则程序将分配该值和/或所有其他输入的值,并且可以使用我输入的“ Scanf Test”进行验证,这将打印数组中的位置,后跟分配给它的编号。在将所有值分配给数组之后,理论上它应该运行下一个测试,该测试就在for循环的下面。问题是,它不是,而是在打印出最后分配的位置和编号后挂起程序。

该程序没有做任何其他事情,只是坐在那里,下面一个人说他运行了这段代码并且运行良好……这使我相信这是我的IDU中的一个编译问题(代码:: Blocks)

毫米

该程序一遍又一遍地打印“ Scanf Test#0 and 1”

这是不检查的结果的结果scanf如果scanf无法读取整数,则流保持不变并报告失败。您无需检查,因此它可以工作一次并且失败9次。

如果输入10个整数,它将正常工作;但是显然您正在输入其他内容,例如字母,这导致整数提取失败。

"%d"格式字符串中只有一个转换规范()时,scanf可以返回:

  • 1 - 成功
  • 0 -输入了垃圾字符
  • EOF-流错误

您应该检查该值并采取适当的措施。如果没有1您可以中止该程序,尽管清除垃圾并再次询问以防万一0

进入实际排序。当您传递N-1给函数时,您的界面很奇怪,然后让该函数访问数组末尾的1个项目。这将是更清晰的做selection_sort(N, a),然后在函数内部,high = n-1for (i = 0; i < n-1; i++)

现在,该行有一个微妙的问题:

void selection_sort(int n, int a[n])

该行与原型不匹配;您可以通过将行替换为来解决问题:

void selection_sort(int n, int a[])

原始版本导致该程序对我而言表现异常,但仅当我在默认模式下调用gcc时(即不符合C标准)。必须有某种GNU扩展在起作用,这会引起麻烦int a[n]

在Standard C中,原始代码应该可以工作(并且,如果通过标准模式调用gcc,确实可以-std=c99,这是我强烈建议做的事情)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章