Put your $c term (in your loop) in a print_r/var_dump to see if the property you are trying to compare the values of is of the actual value that you are looking for
(See below).
I've also added a ternary operator in the place of your if statement, it is just better practice. (Read below for more on ternary operators).
<menu id="nav">
<ul>
<?php $cat_id = get_cat_ID();
foreach( $categories as $c ):?>
<?php print_r($c); ?>
<li class="<?php echo $c->term_id == $cat_id ? 'active' : null ;} ?>">
<a href="<?php echo get_category_link( $c->term_id ); ?>" title="<?php echo $c->cat_name ;?>">
<?php echo $c->cat_name ;?>
</a>
</li>
<?php endforeach; ?>
</ul>
</menu>
Ternary Operator
In computer programming, ?: is a ternary operator that is part of the syntax for a basic conditional expression in several programming languages. It is commonly referred to as the conditional operator, inline if (iif), or ternary if.
if(1==1) echo 'true';
else echo 'false';
can be done in a ternary operator like so:
echo 1==1 ? 'true' : 'false';
Another example
if(1==1) $boolean = true;
else $boolean = false;
can be done in a ternary operator like so:
$boolean = 1==1 ? true : false;
Since PHP 5.3, the 'middle part' of the operator can be left out.
Shorthand ternary operators can be used to match only false
if(1!=2) echo 'false';
The ternary operator:
echo 1!=2 ?: 'false';
Read more:
http://php.net/manual/en/language.operators.comparison.php