cerr
You can use cerr
instead of cout
to debug. cerr
writes to the standard error stream which is not seen by the online judge.
Example:
instead of cout << "x is " << x << '\n';
you can use cerr << "x is " << x << '\n';
One drawback of this is that cerr
increase the runtime of a program. The runtime of the below program would decrease if the cerr
statements were removed.
for(int i = 0; i<n; i++)
{
for(int j = 0; j<n; j++)
{
cout << i*j << "\n";
cerr << "i is " << i << "\n"
cerr << "j is " << j << "\n"
}
}
We are facing a trade-off between coding time and running time.
When our solution seems good, we should remove some debugging statements which consume some time.
To remove the cerr statements quickly you can use #define cerr if(false)cerr
. Thanks to sharepoLOVEDDD for pointing in out in the comments
To redirect cerr
to a file we have three options(source: https://askubuntu.com/questions/625224/how-to-redirect-stderr-to-a-file):
Redirect stdout to one file and stderr to another file:
command > out 2>error
Redirect stderr to stdout (
&1
), and then redirect stdout to a file:command >out 2>&1
Redirect both to a file:
command &> out
Watch Macro
This macro is an easy way to debug variables. It also prints the name of the variable:
#define watch(x) cerr << "\n" << (#x) << " is " << (x) << endl
You can use it like this:
#include<bits/stdc++.h>
using namespace std;
#define watch(x) cerr << "\n" << (#x) << " is " << (x) << endl;
int main()
{
int n;
n = 2*2;
watch(n); //output : n is 4
int exponent = 2;
watch(pow(n,exponent)); //output: pow(n,exponent) is 16
}
Really you should be using a debugger like gdb to do that. One day I will learn how to use it as well. :P
To quickly remove cerr from your code before submitting a solution, you can also use
#define cerr if(false)cerr
Added that to blog post