cs50 Игра в Скрэббл

#c #cs50 #scrabble

Вопрос:

Я играю в скрэббл cs50, но по какой-то причине он возвращает только числа, а не сообщает мне, какой игрок выигрывает. Я знаю, что, должно быть, я где-то облажался в своем for цикле, но я не могу найти проблемы:( Также я добавил int i и int n в compute_score функцию, потому что она продолжает указывать необъявленные идентификаторы, я не понимаю, потому что я думаю, что они находятся в пределах for цикла. Нуби здесь, пожалуйста, посоветуй!

 #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("Player1 wins!n");
    }
    else if (score1 == score2)
    {
        printf("Ties!n");
    }
    else
    {
        printf("Player2 wins!n");
    }
}

int compute_score(string word)
{
    // TODO: Compute and return score for string
    int tem_point[] = {};
    int m; 
    int score = 0;
    int i;
    int n;
    for (i = 0, n = strlen(word); i < n; i  )
    {
        //Turning to ascii number, "A...Z" correspond "65...90", "a...z" correspond "97...122"
        m = get_int("%i", word[i]);
        //Comparing ascii numbers to decide whether upper case, lower case or not characters
        //Calculate index corresponding to POINTS array and assign points to characters 
        //If not character, get zero point
        if (m < 65 || (m > 90 amp;amp; m < 97) || m > 122)
        {
            tem_point[i] = 0;
        }
        //If upper case 
        else if (m >= 65 amp;amp; m <= 90)
        {
            tem_point[i] = POINTS[m - 65];
        }
        //If lower case
        else
        {
            tem_point[i] = POINTS[m - 97];
        }
        score  = tem_point[i]; 
    }
    return score;
    
} 
 

И вот когда я запускаю его:

 ~/pset2/ $ make scrabble
clang -ggdb3 -O0 -std=c11 -Wall -Werror -Wextra -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wshadow    scrabble.c  -lcrypt -lcs50 -lm -o scrabble
~/pset2/ $ ./scrabble
Player 1: abc
Player 2: abc1
97
 

Комментарии:

1. get_int — «Запрашивает у пользователя строку текста из стандартного ввода и возвращает эквивалентное значение int; если текст не представляет значение int или может вызвать переполнение, пользователь повторяется». — Я думаю, что эта функция делает что-то другое, чем вы ожидали.

2. int tem_point[] = {}; объявляет собственный int массив без длины. Позже вы используете его так, как будто в нем есть место для хранения, тем самым вызывая неопределенное поведение .

3. Примечание: если вам нужен i-й символ в качестве числа, то это просто m = word[i]; Вы можете бросить get_int.

4. В качестве примечания, вам не нужно m = get_int(«%i», word[i]); , символы в c сопоставимы с константами. Непосредственно используйте слово[i]

5. Спасибо, ребята! Я последовал вашему совету и заменил m словом[i] и объявил int temp_point[] в первой строке тела цикла for, теперь, когда я запускаю его, там написано ошибка сегментации, я думаю, что здесь что-то не так с моей логикой.