我写了一些在我脑海中有意义并考虑到目前为止我所学到的东西:
int exercicio4a(int *s){
int tmp, i;
int nmax = strlen(s);
int z[nmax];
for(i=0; i!=nmax; i++){
if(s[i]>=s[i+1]){
z[i]=s[i+1];
}else{
z[i]=s[i];
}
}
return z;
}
main(){
int x, y, nmax;
int str[10];
printf("Organize a bunch of numbers:\n");
nmax = 9;
while(nmax!=0){
printf("Enter the random int number %d :\n", nmax);
scanf("%d", &str[nmax]);
nmax--;
}
printf("%s \n", exercicio4a(str) );
}
毋庸置疑,这是垃圾,因为它不会带我到任何地方!
最后一件事,我想知道是否有办法使用GDB来检测此代码中的故障。
干杯!
答案 0 :(得分:2)
嗯,您需要澄清您的条款。你想要对从stdin扫描的整数数组进行排序。不要将这个数组称为字符串,这是不好的术语。您还需要确定exercicio4a是否应该返回一个ascii字符串,其中整数插入字符串或整数数组。
你真的应该为你的函数取一个整数数组,然后进行排序,或者分配一个新的并返回它。
现在让我们看一下代码的问题:
nmax = 9;
while(nmax!=0){
printf("Enter the random int number %d :\n", nmax);
scanf("%d", &str[nmax]);
nmax--;
}
当nmax == 0时,您正在退出循环,但是您永远不会将整数扫描到该位置。解决这个问题:
nmax=10;
while (nmax--) {
//printf
scanf("%d", str + nmax); //or &str[nmax]; these are equal
}
下一步:int exercicio4a(int *s){...
此签名不正确。假设您不想进行排序,您希望返回一个新数组,因此您应该int *exercicio4a(int *s){...
您希望返回指向数组中第一个整数的指针。
Next int z[nmax];
此数组是局部变量。从函数返回时它将超出范围,因此返回后使用它的行为是未定义的!相反,您希望使用int *z = calloc(nmax, sizeof(int));
为已排序的数组动态分配空间。在调用函数完成后,您需要释放返回的数组,以避免内存泄漏。
下一页:printf("%s \n", exercicio4a(str) );
在这里,您尝试将整数打印为字符串(使用您拥有的代码)。即使您修复它以返回int *,您仍将尝试将整数数组作为字符串打印。你应该做的是使用循环来打印数组:
nmax = 10;
int *ptr = exercicio4a(str); //only after you fix exercicio
while (nmax--)
printf("%d ", *ptr++);
最后,您的循环不执行排序。这是尝试交换乱序的相邻元素。它没有正确执行此功能,但不打算让它工作,因为它甚至不会实现排序算法。我建议您阅读插入,气泡和选择排序,以了解如何实现这些算法,如果您想学习如何自己进行排序。但大多数情况下,您将需要使用库函数对数组进行排序。如果要保留数据的未排序副本,请创建一个qsort包装器:
int compare (void *one, void *two) {
return *(int *)one - *(int *)two;
}
int *my_sort(int *arr, int size) {
int *sorted = calloc(size, sizeof(int));
memcpy(sorted, arr, size * sizeof(int));
qsort(sorted, size, sizeof(int), compare);
return sorted;
}