在此范围错误中未声明'system'

时间:2016-01-03 19:07:58

标签: c recursion system pause

所以我没有在其他程序中得到这个错误,但我确实得到了它。

这个程序就是我没有收到错误的例子。

#include<stdio.h>

int main() {



    system("pause");
} // end main

但是在下面这个程序中我得到了错误

#include <stdio.h>
//#include <stdlib.h>

// Takes the number from function1, calculates the result and returns recursively.
int topla (int n) {
    if(n == 1)
    return 3;
    else
        return topla(n-1) + topla(n-1) + topla(n-1);
}

// Takes a number from main and calls function topla to find out what is 3 to the
// power of n 
int function1(int n) {
    return topla(n);
}

int main() {
    int n; // We us this to calculate 3 to the power of n

    printf("Enter a number n to find what 3 to the power n is: ");
    scanf("%d", &n);
    function1(n);

    system("pause");
} // end main

3 个答案:

答案 0 :(得分:2)

只需添加stdlib.h,但不要使用system("pause"),因为它不是标准的,并且不适用于每个系统,只是一个简单的getchar()或涉及{的循环{1}}因为您已经使用过getchar() )应该这样做。

通常scanf()在Windows命令行程序中找到,因为Windows命令提示符在程序退出时关闭,因此可能直接从命令提示符运行程序会有所帮助,或者使用修复此命令的IDE,如 geany

最后总是检查system("pause")的返回值,而不是假设它有效。

注意:此代码

scanf()

你可以写成

return topla(n - 1) + topla(n - 1) + topla(n - 1)

而不是递归调用return 3 * topla(n - 1); 3次。

并且你真的不需要topla()因为函数会返回,除非else所以即使没有n != 1递归也会在else时停止。

答案 1 :(得分:2)

system函数在标准标题<stdlib.h>中声明。如果您的程序调用{​​{1}},则必须

system()

在源文件顶部或附近。

但你的部分问题是:当你省略#include <stdlib.h> 指令时,为什么编译器没有抱怨?

1990 C标准(有时称为&#34; ANSI C&#34;)允许调用尚未显式声明的函数。如果你写,例如:

#include

没有system("pause"); 函数的可见声明,假设system声明的返回类型为system,参数与调用中的参数匹配 - 在此case,类型为int的单个参数。这恰好与char*的实际声明一致,因此使用C90编译器,您可以省略system指令。一些支持更新的1999和2011标准(不允许隐式声明)的C编译器仍然允许旧形式,可能带有警告,以便向后兼容。

即使给出了C90编译器,依赖于现在过时的隐式#include&#34;也没有优势。规则。只需添加int即可。更一般地说,对于您调用的任何库函数,请阅读其文档和#include <stdlib.h>声明它的标题。

至于为什么你的某个程序而不是另一个程序出错,我对此没有解释。也许您使用不同的设置调用了编译器。在任何情况下,它都不重要 - 尽管你可能会研究如何配置你的编译器,以便总是警告这样的事情,这样你就可以避免这种错误。 / p>

答案 2 :(得分:1)

在这里你需要了解两件事。

首先,你的代码工作得非常好,程序确实找到了3 ^ n的值。所以不要担心。

来到system()部分,

为了使用system();函数,您需要包含stdlib.h头文件,因为该函数在该头中声明。

因此,最好包含标题(而不是评论它)。

现在,在Windows中使用了pause关键字,以便在程序完成后停止控制台关闭,它仅适用于Windows。

请注意,system("pause");也不是标准,并且它不适用于其他计算机,即linux,使用system命令,您可以直接与命令行进行交互。在这方面,每个操作系统的命令都是特定的,它们不能用于其他操作系统。

因此,最好使用C标准库函数getchar();来保存控制台窗口。