【问题标题】:C++ cout will not print [duplicate]C ++ cout不会打印[重复]
【发布时间】:2014-09-11 19:19:58
【问题描述】:

正如标题所说,cout 不会打印任何东西!但是 main 正常完成并返回一个负数,这是怎么回事?这是我的代码:

#include <iostream>
using namespace std;
unsigned long fibonacci(long unsigned int *);
int main(void)
{
    cout<<"IT WILL NOT PRINT!!!!!";
    unsigned long int fib[4000000];
    cout<<"SUM OF EVEN FIBONACCI NUMBERS: "<<fibonacci(fib)<<endl;
    return 0;
}
unsigned long fibonacci(unsigned long int *FIBO)
{
    unsigned long i;
    int sum=0,c=0, *EVEN = new int[2000000];
    FIBO[0]=1; FIBO[1]=2;
    for (i=2;i<3999999;i++){
        FIBO[i]=FIBO[i-1]+FIBO[i-2];
        if (FIBO[i]%2==0){
            EVEN[c]=FIBO[i];
            sum+=EVEN[c];
            c++;
        }
    }
    delete [] EVEN;
    return sum;
}

【问题讨论】:

  • 欢迎来到本站!请将您的代码发布到您的问题中。缩进四个空格,使其看起来像网站上的代码。祝你好运!
  • 尝试在您的first cout 之后添加endl。在您刷新标准输出之前,您可能在fibonacci 中失败了。
  • @PaulEvans 我做了,但这不是问题,因为你可以看到它不打印 cout
  • 相信不一样,我试过这篇文章,什么也没有。实际上没有任何作用!我什至返回 293;在 int main(void) 之后什么都没有,这是为什么呢?
  • 不一样,因为你的程序崩溃了。

标签: c++ printing main cout


【解决方案1】:

std::cout 默认是缓冲的。如果没有显式刷新,在需要刷新内部缓冲区之前,您将看不到任何打印内容。这样做是出于性能原因。

您可以添加特定的刷新,如下所示: std::cout&lt;&lt;"IT WILL NOT PRINT!!!!!" &lt;&lt; std::endl;

也就是说,您没有看到输出,因为您的程序正在崩溃

unsigned long int fib[4000000]; 将需要将近 15MB 的空间(在 32 位长 int 平台上)。在该存储期限内根本没有足够的堆栈空间来分配如此大的内存块。

对于这么大的块,您需要动态分配块,或者更好:

std::vector&lt;unsigned long int&gt; fib(4000000);

【讨论】:

  • 还是同样的问题;(
  • 所以,这不打印任何东西? #include &lt;iostream&gt; int main { std::cout &lt;&lt; "Hello." }?如果它确实,你的真实程序正在崩溃(不,你不会看到输出)。
  • @SasukeItachiUchihaClan:你的程序也为我崩溃了,但是如果我减小巨大数组“fib”的大小,它不会崩溃。
  • 确实会打印,但即使在我的程序上使用了 flush 和 endl 后它也不会做任何事情,实际上这不是 cout 问题,它不会做任何事情,只是返回一个负数。我什至在 int main(void){ 之后返回 -293 但没有任何反应
  • 因为你的程序崩溃了。你没看答案吗?你不能在堆栈上分配 15MB,它会立即崩溃——在它做任何其他事情之前。
【解决方案2】:

但是main正常结束并返回一个负数,

在您的代码中,main 返回 0,这是唯一的返回路径。因此,以负返回码退出的进程意味着main() 从未完成。

很可能,数组unsigned long int fib[4000000]; 对于您系统的默认堆栈大小来说太大了,操作系统通过让您的进程退出该负数来处理这个问题。

要解决这个问题,要么将该数组缩小很多,要么将其完全删除;或使用动态分配。

请注意,甚至不需要这个数组(也不需要EVEN)。您随时保留总和,因此您只需要保留最后 2 个数字;不是整个历史。

【讨论】:

    【解决方案3】:

    让我们来看看这个问题:我们想要在预定义的范围内生成偶数斐波那契数的总和。

    为了清晰起见,重新排列了一些小改动:

    #include <iostream>
    using namespace std;
    unsigned long fibonacci(unsigned long int *FIBO)
    {
        unsigned long i;
        int sum=0,c=0, *EVEN = new int[2000000];
        FIBO[0]=1; FIBO[1]=2;
        for (i=2;i<3999999;i++){
            FIBO[i]=FIBO[i-1]+FIBO[i-2];
            if (FIBO[i]%2==0){
                EVEN[c]=FIBO[i];
                sum+=EVEN[c];
                c++;
            }
        }
        delete [] EVEN;
        return sum;
    }
    int main(void)
    {
        unsigned long int fib[4000000];
        cout << "SUM OF EVEN FIBONACCI NUMBERS: " << fibonacci(fib) << endl;
        return 0;
    }
    

    首先,让我们删除函数 fibonacci 中不需要的代码。我们不需要存储偶数,因此我们将删除 EVEN 数组。

    unsigned long fibonacci(unsigned long *FIBO)
    {
        unsigned long i, sum=0;
        FIBO[0]=1; FIBO[1]=2;
        for (i=2;i<3999999;i++){
            FIBO[i]=FIBO[i-1]+FIBO[i-2];
            if (FIBO[i]%2==0){
                sum += FIBO[i];
            }
        }
        return sum;
    }
    

    我们可以变得更聪明一点——我们可以证明每三个斐波那契数都是偶数。从 Fib(0)=0 开始,我们可以创建一个新函数:

    unsigned long sum_even_fibonacci(unsigned long n)
    {
        unsigned long i, a=0, b=1, c=1, sum=0;
        for (i=0;i<n/3;i++){
            a = b + c; // Fib(3i)
            b = a + c; // Fib(3i+1)
            c = a + b; // Fib(3i+2)
            sum += a;  // Fib(3i) will always be even- add it to sum.
        }
        return sum;
    }
    

    这应该产生该系列的前 n 个数字中偶数斐波那契数的总和。

    完整的新程序:

    #include <iostream>
    using namespace std;
    unsigned long sum_even_fibonacci(unsigned long n)
    {
        unsigned long i, a=0, b=1, c=1, sum=0;
        for (i=0;i<n/3;i++){
            a = b + c; // Fib(3i)
            b = a + c; // Fib(3i+1)
            c = a + b; // Fib(3i+2)
            sum += a;  // Fib(3i) will always be even- add it to sum.
        }
        return sum;
    }
    int main(void)
    {
        cout << "SUM OF EVEN FIBONACCI NUMBERS: " << sum_even_fibonacci(4000000) << endl;
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-01-29
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      • 1970-01-01
      相关资源
      最近更新 更多