我试图通过编写冒泡排序程序来与C一起练习。直到现在的问题似乎是,在不再满足条件但似乎未在循环中执行命令之后,为数组的单元格赋值的for循环被卡住了。我不知道到底发生了什么,我添加了一些额外的代码来查看正在发生的事情,这些都是我的结论。这是代码:
#include <stdio.h>
#include <stdlib.h>
void swap(int *x, int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}
int *sort(int *array)
{
int finish = 1;
while (finish = 1)
{
finish = 0;
for (int i = 0; i <= sizeof(array); i++)
{
if ((array + i) > (array + i + 1))
{
swap(array + i, array + i + 1);
finish = 1;
}
}
}
return array;
}
int main()
{
int s, res;
printf("Give me the size of the array being sorted(larger than 1) : ");
do
{
res = scanf("%d", &s);
if (res != 1)
{
printf("Wrong Input!\n");
exit(1);
}
if (s < 2)
printf("Only numbers equal or larger than 2\n");
} while (s < 2);
int array[s];
for (int i = 0; i < s; i += 1)
{
scanf("%d", array + i);
printf("%d %d %d\n\n", *(array + i), i, i < s); // I used this to check if my values were ok
}
printf("end of reading the array"); //I added this line to see if I would exit the for loop. I am not seeing this message
sort(array);
printf("\n");
for (int i = 0; i < sizeof(array); i++)
printf("%d\n\n", array + i);
printf("Array has been sorted! Have a nice day!\n\n************************************************************");
return 0;
}
答案 0 :(得分:3)
请参见代码中的注释:
#include <stddef.h> // size_t 1)
#include <stdio.h>
#include <stdlib.h>
void swap(int *x, int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}
int *sort(int *array, size_t size) // needs an extra parameter to know the size of the array
{
int finish = 1;
while (finish /* = 1 * you don't want assignment, you want comparison: */ == 1)
{
finish = 0;
for (int i = 0; i /* <= sizeof(array) */ < size - 1; i++) // i should be of type size_t
{
// if ((array + i) > (array + i + 1)) you are not dereferencing:
if(array[i] > array[i + 1])
{
// swap(array + i, array + i + 1); // easier to read imho:
swap(&array[i], &array[i + 1]);
finish = 1;
}
}
}
return array; // why does this function return anything? it is never used.
}
int main()
{
int s; /* , res; no need for an extra variable res */
printf("Give me the size of the array being sorted(larger than 1) : ");
do
{
// res = scanf("%d", &s);
// if (res != 1)
if (scanf("%d", &s) != 1)
{
printf("Wrong Input!\n");
// exit(1); // should be EXIT_FAILURE. Use return instead of exit() when in main().
return EXIT_FAILURE;
}
if (s < 2)
printf("Only numbers equal or larger than 2\n");
} while (s < 2);
int array[s];
for (int i = 0; i < s; /* i += 1* idiomatic: */ ++i) // size_t would be the correct type for s and i.
{
scanf("%d", /* array + i use indexes: */ &array[i]);
printf("%d %d %d\n\n", array[i], i, i < s); // again: indexes. i < s is allready ensured by the condition of the for-loop
}
printf("end of reading the array");
// sort(array); // sort will have no idea about the size of array use
sort(array, s); // instead.
printf("\n");
for (int i = 0; i < /* sizeof(array) 2) */ s; i++)
printf("%d\n\n", /* array + i * again you don't dereference */ array[i]);
printf("Array has been sorted! Have a nice day!\n\n************************************************************");
return 0;
}
1)size_t
是保证足够大以容纳所有大小的对象并在其中建立索引的类型。 scanf()
的转换说明是"%zu"
。
2)sizeof(array)
中的main()
将产生array
中的字节数,但是您需要元素数,因此必须使用sizeof(array) / sizeof(*array)
。但这不是必需的,因为您已经知道它的大小。是s
。
答案 1 :(得分:0)
此行
printf("end of reading the array");
在字符串末尾没有换行符。这是一个问题,因为printf
是称为“缓冲IO”的功能家族的一部分。 C库维护着您要打印的内容的缓冲区,并且仅在缓冲区已满或在字符流中遇到\n
时才将它们发送到终端。在打印换行符之前,屏幕上不会显示end of reading the array
。您只能在调用sort()
后 执行此操作。因此,您所知道的是您的程序在sort
结束之前的某个时刻陷入了无限循环。
因此实际上存在三个可能无限的循环:您标识的for
循环,while
中的sort
循环和{{1内的for
循环}}循环。正如其他答案所指出的那样,您犯了一个经典错误,即在while
条件
while
除非您的C编译器确实很老,否则它可能会在该行上输出警告。您应该注意警告。
此外,您应该学习而不是以后使用调试器。相信我,它将为您节省很多查找错误的时间。
答案 2 :(得分:-1)
在排序函数sizeof(array)
中返回指针的大小。 (您可以使用printf("%d", sizeof(array)
自行检查。
解决方案是将您的功能更改为:
int sort(int* array, size_t size) { ... }
并使用正确的数组大小调用它:
sort(array, s);