我不知道如何将参数传递给insertSort
。我也不确定我是否正确使用scanf
。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void insertSort(int LENGTH, int *arr)
{
int temp;
for(int i=0; i<LENGTH; i++)
{
temp = arr[i];
for(int j=i+1; j<LENGTH; j++)
{
if( temp > arr[j] )
{
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
int main()
{
int LENGTH = 10;
int *arr = malloc(sizeof(int)*LENGTH); //create dynamic memory
memset(arr, 0, LENGTH); //initialize the space
printf("please enter nums length : %d\n", LENGTH);
for(int i=0; i<LENGTH; i++) //put numbers to the dynamic space
{
printf("%d index : ", i);
scanf("%d", &arr[i]);
}
for(int i=0; i<LENGTH; i++) //print those space
printf("%3d", arr[i]);
insertSort(&LENGTH, &arr); //SORT !
for(int i=0; i<LENGTH; i++)
printf("%3d", arr[i]);
}
答案 0 :(得分:0)
让我们一次拿一件。对于初学者来说,您的insertSort
不是插入排序。插入排序实现如下所示:
void insertSort(int LENGTH, int *arr)
{
for (int i = 1; i < LENGTH; i++)
{
int tmp = arr[i], j;
for (j = i; j >= 1 && tmp < arr[j-1]; j--)
arr[j] = arr[j-1];
arr[j] = tmp;
}
}
接下来,当您测试功能等时,放弃用户输入,仅使用一组固定的数据作为测试用例来测试您的功能,例如
int main(void) {
int arr[] = { 10, 2, 8, 5, 4, 6, 7, 3, 9, 1 },
nmemb = (int)(sizeof arr/sizeof *arr);
insertSort (nmemb, arr);
for (int i = 0; i < nmemb; i++)
printf ("%3d", arr[i]);
putchar ('\n');
}
最后,scanf
。除非您验证其退货,否则您无法开始正确使用scanf
。此外,在您的情况下,如果用户键入"ten"
而不是数字10
会发生什么?请尝试...
每次进行用户输入时,您都必须考虑保留在输入缓冲区中的每个字符(此处为stdin
)。由于scanf
处理 input 或 matching 失败的方式而使用scanf
(或族)输入时,尤其如此。发生任何一种情况时,不再读取任何字符,并且在输入缓冲区中不读取任何令人讨厌的字符-只是等待在下一次尝试读取时再次咬住您(如果您遇到这种情况,通常会导致无限循环正在循环输入)
(这是建议使用fgets
或POSIX getline
之类的面向 line 的功能的主要原因之一)
scanf
。这意味着您负责每次检查scanf
的退货。您必须处理三个条件
(return == EOF)
用户通过按 Ctrl + d (或在Windows Ctrl + z 上)生成手册EOF
来取消输入CTRL+Z does not generate EOF in Windows 10); (return == expected No. of conversions)
表示读取成功-然后由您检查输入是否满足任何其他条件(例如正整数,正浮点等);和'\n'
或EOF
并丢弃所有剩余的多余字符为止)完成工作后,可以根据需要成功使用scanf
。