Error: Ignoring return value of function declared with pure attribute

Viewed 372
#include <ctype.h>
#include <cs50.h>
#include <stdio.h>
#include <string.h>

// Points assigned to each letter of the alphabet
int POINTS[] = { 1, 3, 3, 2, 1, 4, 2, 4, 1, 8, 5, 1, 3, 1, 1, 3, 10, 1, 1, 1, 1, 4, 4, 8, 4, 10 };

int compute_score(string word);

int main(void)
{
    // Get input words from both players
    string word1 = get_string("Player 1: ");
    string word2 = get_string("Player 2: ");

    // Score both words
    int score1 = compute_score(word1);
    int score2 = compute_score(word2);

    // TODO: Print the winner
    if (score1 > score2) {
        printf("Player 1 wins!\n");
    } else if (score2 > score1) {
        printf("Player 2 wins!\n");
    } else {
        printf("Tie!\n");
    }
}

int compute_score(string word)
{
    // TODO: Compute and return score for string
    int score = 0;

    for (int i = 0, n = strlen(word); i < n; i++) {
        if (isalpha(word[i])) {
            tolower(word[i]);
            score += POINTS[word[i] - 64];
        }
    }
    return score;
}

It seems to be saying there is something wrong with the return value of the compute_score function. I tried everything but don't know what is up. It says it is on line 38 character 13. I tried to comment out certain parts of the code but it still comes up with the same error.

1 Answers

Presumably, that message is coming from the tolower(word[i]); line – because you are ignoring the return value of the call to tolower. And you shouldn't be ignoring it, because it's the value you want to assign to word[i].

The tolower function takes a (plain) int argument, which means it is passed by value (i.e. a copy is sent to the function) and the value of the variable in the calling function won't (can't) be changed.

Instead, the (possibly) modified (lowercase) character will be in the returned value that you are ignoring.

So, instead of the erroneous call you make, use this:

word[i] = (char)tolower((unsigned char)word[i]);

(Many people will lazily ignore the two casts; but they really should be used: Do I need to cast to unsigned char before calling toupper(), tolower(), et al.?)


Also (though not related to your error message), the following line is highly suspicious:

score += POINTS[word[i] - 64];

Using the ASCII character set, this will give the 1-based index into your array for uppercase letters; lowercase letters will be virtually guaranteed to cause an out-of-bounds error accessing the POINTS array.

Don't use such "magic" numbers in your code. For a zero-based index using lowercase letters, use this:

score += POINTS[word[i] - 'a'];

In fact, you can combine the two lines I have offered corrections for into one:

score += POINTS[tolower((unsigned char)word[i]) - 'a'];
Related