组织int - 使用调试器的字符串

时间:2014-05-21 20:50:52

标签: c gdb

正如我之前所说的那样,我正在家中学习C,并在途中遇到一些障碍。谢谢你,我一点一点地学习。

我写了一些在我脑海中有意义并考虑到目前为止我所学到的东西:

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来检测此代码中的故障。

干杯!

1 个答案:

答案 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;
}