我正在练习C#并编写下面的代码,不包括以“int main() {
unsigned int i=0, n;
scanf("%d", &n);
int **array=malloc(2*sizeof(int*));
for(;i<2;i++) *(array+i)=malloc(n*sizeof(int));
for(i=0;i<n;i++){/*Takes input via scanf*/
/* Calculate and store the result in **(array+i), *(*(array+i)+1))*/
}
for(i=0;i<n;i++) printf("%d %d\n", **(array+i), *(*(array+i)+1));
/*Prints the outputs. This is where the runtime error happens*/
return EXIT_SUCCESS;
}
....”开头的行。输出如预期的那样(即“5,7,2”)。
当我包括“Array.Sort
...”这一行时,我期望得到“2,5,7”,但输出“5,5,7”,即2号已经消失了以某种方式取代了5。任何人都可以帮助解释为什么(对初学者)?
Array.Sort
答案 0 :(得分:3)
您不需要for
循环来排序。只需Array.Sort
即可对您的数组进行排序:
int[] numbers = new int[3] { 5, 7, 2 };
Array.Sort(numbers);
对数组进行排序后,可以打印排序后的数组:
for (int i = 0; i< numbers.Length; i++) {
Console.Write(numbers[i] + " , ");
}
答案 1 :(得分:1)
您在循环中排序,之前写入i
值。所以你的代码就像这样
您可能想要对数组进行排序,然后将其写出来:
int[] numbers = new int[3] { 5, 7, 2 };
Array.Sort(numbers);
for (int i = 0; i< numbers.Length; i++)
{
Console.Write(numbers[i] + " , ");
}
顺便说一下,你也可以使用string.Join
并避免循环(和逗号尾随):
var commaSeparatedNums = string.Join(", ", numbers);
Console.Write(commaSeparatedNums);
答案 2 :(得分:0)
您正在循环中对数组进行排序。排序仅在第一次应用时更改数组;排序的第二次和第三次调用不会对数组进行任何更改。
第一次打印输出发生在未排序的数组上;第二个打印输出发生在排序的数组上。第一次5
是初始数字;第二次,5
位于中间。这就是为什么你看到5
打印两次。
为了解决这个问题,您需要在进入打印循环之前对数组进行一次排序:
Array.Sort(numbers);
for (int i = 0; i< numbers.Length; i++) {
Console.Write(numbers[i] + " , ");
}
答案 3 :(得分:0)
Array.sort是一种不需要任何循环迭代的方法,只需调用它就足够了
你的问题是因为你循环和排序3次而完全没必要的...... 现在,您正在将元素置于 i 位置,然后排序并执行此操作3次...查看动画以获得更多说明性解释
你正在排序正确,但正在通过索引读取数组索引的元素,这是不正确的,没有必要
删除孔for循环,只需调用Array.Sort(数字);
//for (int i = 0; i< numbers.Length; i++)
//{
//Console.Write(numbers[i] + " , ");
Array.Sort(numbers);
//}
答案 4 :(得分:0)
不使用循环使用Array.Sort。如果你想对数组进行排序。
int[] numbers = new int[3] { 5, 7, 2 };
Array.Sort(numbers);