我运行此代码,并要求用户输入,然后在它开始将所有这些数字输入到数组位置时挂起,因此在此处进行了一些测试,以帮助我找出导致挂起的原因。我不知道。这要么非常简单,要么就与我的编译器(代码:: 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
-输入了垃圾字符您应该检查该值并采取适当的措施。如果没有1
,您可以中止该程序,尽管清除垃圾并再次询问以防万一0
。
进入实际排序。当您传递N-1
给函数时,您的界面很奇怪,然后让该函数访问数组末尾的1个项目。这将是更清晰的做selection_sort(N, a)
,然后在函数内部,high = n-1
和for (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] 删除。
我来说两句