gpt4 book ai didi

c - 对于此选择排序,当我的数组中从未使用 0 时,为什么第一个数字是 0? (在c中)

转载 作者:行者123 更新时间:2023-11-30 16:00:17 25 4
gpt4 key购买 nike

这是 main 调用的代码,用于在 C 语言中使用选择排序对数组进行排序。我在 main 中打开了一个文件,并将前 10 个整数放入数组中,将第 11 个整数放入变量中,然后调用一堆简单的函数。整个事情重复了三遍。对于我的测试文件,最后两次迭代具有正确的打印排序,但第一次以 0 开头,但我的数组中没有 0。它还会删除最后一个整数。

预先感谢您的所有帮助!!

这是我的代码:

    void sortme (int arry [], int last_int)
{
int temp;
int smallest_int;
int current_int;
int target_searcher;
int numPrinted;

for(current_int = 0; current_int < last_int; current_int++)
{
smallest_int = current_int;

for(target_searcher = current_int + 1; target_searcher <= last_int; target_searcher++)
if(arry[target_searcher] < arry[smallest_int])
smallest_int = target_searcher;

temp = arry[current_int];
arry[current_int] = arry[smallest_int];
arry[smallest_int] = temp;
} //end outter loop

numPrinted = 0;

printf("\nThe sorted array is: ");
for(current_int = 0; current_int < SIZE; current_int++)
{
printf("%4d", arry[current_int]);
if(numPrinted < COUNT)
numPrinted++;
else
{
printf("\n");
numPrinted = 0;
}
}
printf("\n");

return;
}

这是我的输出供引用(大部分内容都在 main.c 中注释掉):

The file opened.

Scanned into a[] and target is 33

ARRAY[1]
The contents in the array are: 40 32 57 27 67 6 3 89 2 99
The sorted array is: 0 2 3 6 27 32 40 57 67 89
The value searched, 33, was not found.

Scanned into a[] and target is 3

ARRAY[2]
The contents in the array are: 86 43 89 32 45 12 1 58 98 4
The sorted array is: 1 4 12 32 43 45 58 86 89 98
The value searched, 3, was not found.

Scanned into a[] and target is 11

ARRAY[3]
The contents in the array are: 1 2 3 4 5 6 7 8 9 10
The sorted array is: 1 2 3 4 5 6 7 8 9 10
The value searched, 11, was not found.
Closing the file.
The file closed.

最佳答案

在搜索最小值时,您允许 target_searcher 等于 last_int。因此,有时您会在数组中注入(inject)一个随机的小值(并弄乱不属于您的内存)。当然,我假设 last_int 是数组的长度。

当您处理“仅有效索引”时,范围是从 0len-1。您可以通过长度为 1 的数组看到这一点(以防您再次有疑问)。由于只有 1 个元素,因此它位于 array[0]array[len-1]

话虽如此,通常习惯以数组和长度的形式传递参数,而不是数组和最后一个有效元素的索引。这是更自然的。假设您有一个包含 len1len2 两个 block 的大型数组,以及一个对这些分区执行某些操作的函数。如果您使用长度作为参数,则使用:

processBlock(arr, len1);
processBlock(arr + len1, len2);

如果您要使用最后一个有效索引,则您必须处理所有这些 +/-1 术语。所以它是:

processBlockIdx(arr, len1 - 1);
processBlockIdx(arr + len1, len2 - 1);

或者:

processBlockIdx(arr, lastIdx1);
processBlockIdx(arr + lastIdx1 +1, lastIdx2 - lastIdx1 - 1);

关于第二个问题的答案:是的,问题是由于访问数组边界之外的元素引起的。由于 C 没有检查数组边界的安全网,因此这样的错误通常表现为结果中出现无法解释的值,或更糟糕的是应用程序崩溃。在某些情况下,您没有那么幸运,它会在程序中完全不相关的部分体现问题。因此,最好非常确定数组元素的访问。

关于c - 对于此选择排序,当我的数组中从未使用 0 时,为什么第一个数字是 0? (在c中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7868356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com