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'];
#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'];