3

我是一名初级程序员,我正在学习我的第一语言 C。

我主要从 Deitel 和 Deitel 的 C How to Program 一书中学习,但也使用来自大学的示例任务和事物,但是我被困在一个。

我对指针有一个非常非常基本的理解 - 在变量前面添加 & 使它打印一个地址,并且 * 使用指针来使用存储在该地址等处的值。

我编写的代码用于计算两个数字的最大(最大?)公分母,实际上根本不需要或涉及指针。它使用两个函数并且逻辑都是正确的,因为如果我从第二个函数执行它,它会在屏幕上打印出正确的答案,而不是将其返回到主函数。这就是问题所在。

当第二个函数返回答案值时,由于某种原因它返回我只能假设是一个指针。我不知道它为什么这样做。我将能够使用它并将其转换为查找值 - 但是它似乎是第二个函数的本地指针并被覆盖。我在网络上或在我的书中找不到任何东西可以让我知道如何解决这个问题。

谢谢你读到这里。我跑题太多了。

这是我的代码和输出。任何帮助或指示(请原谅双关语)将不胜感激。我知道我可以让它在第二个函数中打印,但我更想知道它如何以及为什么它没有像我想要的那样返回值。

代码

#include <stdio.h>
int greatestCD (int num1, int num2);

int main(void)
{
    int a=0, b=0;
    int result;
    printf("Please enter two numbers to calculate the greatest common denominator from\n");
    scanf("%d%d", &a, &b);
    result = greatestCD (a,b);
    printf("Using the correct in main way:\nThe greatest common denominator of %d and %d is %d\n",a,b, result);
}

int greatestCD (int num1 ,int num2)
{ 

    if (num2==0){
        printf("Using the cheaty in gcd function way:\nThe greatest common denominator is %d\n",num1);
        return num1;
    } else {
        greatestCD(num2,(num1%num2));
    }    
}

输出(使用 12 和 15 - 答案应该是 3)

C:\Users\Sam\Documents\C programs>gcd
Please enter two numbers to calculate the greatest common denominator from
12
15
Using the cheaty in gcd function way:
The greatest common denominator is 3
Using the correct in main way:
The greatest common denominator of 12 and 15 is 2293524

来自 frankodwyer 的这样一个简单的解决方案。这是我无法发现或不知道的微小事物。那么返回的不是指针而是垃圾?

太感谢了。

4

5 回答 5

10

您在函数 bestCD() 的最后一行缺少“return”语句

greatestCD(num2,(num1%num2));

做了

return greatestCD(num2,(num1%num2));

(你可能还有进一步的调试要做,但这就是为什么它返回垃圾......你没有告诉它还有什么要返回)

编辑:我还建议在将来编译时打开所有编译器警告...如果您使用的是 gcc,请尝试将标志-Wall添加到您的编译命令中。当你做的事情可能会导致这样的错误时,这应该会警告你。(并非每个此类警告都必然是错误,因此是“警告”,但它通常表示可能存在问题。)

于 2008-12-26T19:08:58.343 回答
4

由于您正在学习 C,与您的缺失返回错误无关,这里有一些观察和建议:

  • 指针是该语言最难学的特性,尤其是当你进入malloc()and时free()不要气馁

  • 扔掉 Deitel 和 Deitel,给自己买一份Kernighan 和 Ritchie的副本。这是有史以来最好的语言书籍之一。

  • 始终打开所有警告。 如果可以使用 MacOS 或 Linux,那就gcc -Wall -Werror -O不错了。

  • 在valgrind下运行每个 C 程序。Valgrind 是一个很棒的工具,旨在捕捉您使用指针的方式中的错误。它会拯救你的培根!

祝你好运!

于 2008-12-26T20:55:50.280 回答
2

您不会从函数中返回任何内容,因此值 2293524 只是随机垃圾。你的编译器没有给你一个关于缺少返回值的警告吗?

于 2008-12-26T19:07:32.123 回答
2

请参阅我不应该使用 Herb Schildt Book to Learn From的问题,特别是http://www.cs.technion.ac.il/users/yechiel/CS/BadBooksC+C++.html中引用的列表。尽管它列出了 Deitel 和 Deitel 的 C++ 书籍,但特定作者的书籍之间往往存在很强的家族相似性。我倾向于给自己买一本关于 C 的好书。我从 Kernighan & Ritchie 那里学到了(第一版,当时只有一个版本),所以我会推荐它——它简洁准确(就像 C 本身一样)。

于 2008-12-26T22:37:47.767 回答
0

更奇怪的是,该程序可以在我的 linux 机器上运行。gcc 的错误或功能?

/dev/shm $ gcc x.c
/dev/shm $ ./a.out
Please enter two numbers to calculate the greatest common denominator from
12
15
Using the cheaty in gcd function way:
The greatest common denominator is 3
Using the correct in main way:
The greatest common denominator of 12 and 15 is 3
/dev/shm $ gcc --version
gcc (Debian 4.3.2-1) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
于 2008-12-26T19:30:03.183 回答