Error: Ignoring return value of function declared with pure attribute

Error: Ignoring return value of function declared with pure attribute

#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;
}

好像是说compute_score函数的return值有问题。我尝试了一切,但不知道发生了什么。它说它在第 38 行第 13 个字符上。我试图注释掉代码的某些部分,但它仍然出现相同的错误。

据推测,该消息来自 tolower(word[i]); 行 – 因为您 忽略了对 tolower 的调用的 return 值.而且您不应该忽略它,因为它是您要分配给 word[i].

的值

tolower function 接受一个(普通的)int 参数,这意味着它 通过值 传递(即 copy 被发送到函数)并且调用函数中变量的值不会(不能)改变。

相反,(可能)修改的(小写)字符将在您忽略的 returned 值中。

因此,不要使用您的错误调用,而是使用:

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

(许多人会懒惰地忽略这两个转换;但它们确实应该使用:Do I need to cast to unsigned char before calling toupper(), tolower(), et al.?


此外(尽管与您的错误消息无关),以下行非常可疑:

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

使用 ASCII 字符集,这将为 大写 字母的数组提供 1-based 索引;小写字母几乎肯定会导致访问 POINTS 数组时出现 out-of-bounds 错误。

不要在您的代码中使用此类“神奇”数字。对于使用 zero-based 索引使用 小写 字母,使用此:

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

实际上,您可以将我提供的两行更正内容合二为一:

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