It probably isn't efficient, but it is due tomorrow, and so I did what I could.
Well, it's better to try than to be spoonfed.

If you are interested, my answer follows. If it is still not yet past your deadline, I hope that you have the honesty not to copy

Consider the sine computation expressed in summation notation:
From n = 0 to infinity
sine(x) = sum of (-1)^n * (x^(2n+1) / (2n+1)!)

(-1)^n just gives us the sign of the term, so it is not so interesting. What is interesting is the term itself, excluding the sign. As mentioned, it is expensive to calculate the power and the factorial on each iteration, and we risk overflow. What we can do is express the term in relation to the previous term, i.e., a recurrence relation:

0th term = x
nth term = (n-1)th term * (x^2 / (2n * (2n+1)))

Now, x^2 is a loop invariant: it does not change on each iteration. (2n * (2n+1)) is relatively quick to compute and will not overflow unless n is large. Consequently, (x^2 / (2n * (2n+1))) tends to 0 as n tends to infinity. So, all we need to do is keep looping as long as (x^2 / (2n * (2n+1))) is greater than 0.000001.

As such, a solution presents itself:
Code:
#include <stdio.h>

const double EPSILON = 0.000001;

double sine_nonneg(double x)
{
    double term = x;
    double sum = x;
    int sign = -1;
    double x_squared = x * x;
    int i;

    for (i = 1; term > EPSILON; ++i)
    {
        term *= x_squared / ((i + i) * (i + i + 1));
        sum += sign * term;
        sign = -sign;
    }

    return sum;
}

double sine(double x)
{
    return x < 0.0 ? -sine_nonneg(-x) : sine_nonneg(x);
}

int main(void)
{
    printf("&#37;f\n", sine(-12.34));
    return 0;
}
I chose to use the sine_nonneg function so as to more easily handle the sine of a negative angle by having sine_nonneg compute the sine of the corresponding non-negative angle.