这里是C的新手。我正在编写一个程序,它将对随机整数列表进行排序和搜索以用于学习目的,并尝试实现冒泡排序,但在调试期间我的控制台会得到奇怪的结果。
我有一个像这样的数组:
Microsoft ASP.NET
因此,如果我要将此列表从最小到最大排序,则应该按相反顺序排序。相反,我的排序功能似乎在逻辑上有缺陷,并输出以下内容。
arr[0] = 3
arr[1] = 2
arr[2] = 1
显然我是新人,因为知道更好的人可能会很快发现我的错误。
find.c
arr[0] = 0
arr[1] = 1
arr[2] = 2
helpers.c
/**
* Prompts user for as many as MAX values until EOF is reached,
* then proceeds to search that "haystack" of values for given needle.
*
* Usage: ./find needle
*
* where needle is the value to find in a haystack of values
*/
#include <cs50.h>
#include <stdio.h>
#include <stdlib.h>
#include "helpers.h"
// maximum amount of hay
const int MAX = 65536;
int main(int argc, string argv[])
{
// ensure proper usage
if (argc != 2)
{
printf("Usage: ./find needle\n");
return -1;
}
// remember needle
int needle = atoi(argv[1]);
// fill haystack
int size;
int haystack[MAX];
for (size = 0; size < MAX; size++)
{
// wait for hay until EOF
printf("\nhaystack[%i] = ", size);
int straw = get_int();
if (straw == INT_MAX)
{
break;
}
// add hay to stack
haystack[size] = straw;
}
printf("\n");
// sort the haystack
sort(haystack, size);
// try to find needle in haystack
if (search(needle, haystack, size))
{
printf("\nFound needle in haystack!\n\n");
return 0;
}
else
{
printf("\nDidn't find needle in haystack.\n\n");
return 1;
}
}
答案 0 :(得分:3)
问题是你进行比较并在进行测试$ tree
.
├── folder1
│ └── ouput
│ ├── foo_bar.png
│ ├── xxxxx_abcdefg.png
│ └── xxxxx_ab.png
├── folder2
│ └── ouput
│ ├── xxxxx_abcdefg.png
│ └── xxxxx_ab.png
└── rename.sh
4 directories, 6 files
$ ./rename.sh
$ tree
.
├── folder1
│ └── ouput
│ ├── folder1_abcdefg.png
│ ├── folder1_ab.png
│ └── foo_bar.png
├── folder2
│ └── ouput
│ ├── folder2_abcdefg.png
│ └── folder2_ab.png
└── rename.sh
之前交换。这意味着它将在if (i >= n - 1)
时比较values[i] > values[i+1]
,因此它将在数组边界外访问,这是未定义的行为。在你的情况下,数组后面的内存中恰好有i == n-1
,所以这会被交换到数组中,然后它被排序到数组的开头。
更改
0
到
if (values[i] > values[i+1])
答案 1 :(得分:2)
您可以在数组0..n-1
中交换的最高条目是n-2
和n-1
。因此i
可能不会大于n-2
,因此i+1
访问n-1
。
因此,您的支票必须是:
if (i > n - 2)