1

私は 7 文字を生成するスクラブル プログラムに取り組んでおり、ユーザーが単語を入力して、それらが有効かどうか、およびポイント値がどうなるかを確認できます。価値観をやり始めてすぐに、問題が発生し始めました。

このように関数 wordvalue を呼び出し、結果を値に格納したいと考えています。ユーザーの単語は、userword[8] に格納されます。

int value = wordvalue(userword[8]);

これは、配列セルにある文字を見つけて追加するコードです。何が問題なのかわかりませんが、このステップで毎回クラッシュします。

int wordvalue (char userword[8]){

    int m;
    int currentvalue = 0;

    for (m=0; m < 8; m++){

        switch (userword[m]){

        case 'A':
        case 'E':
        case 'I':
        case 'L':
        case 'N':
        case 'O':
        case 'R':
        case 'S':
        case 'T':
        case 'U':
            currentvalue = currentvalue + 1;
            break;
        case 'D':
        case 'G':
            currentvalue = currentvalue + 2;
            break;
        case 'B':
        case 'C':
        case 'M':
        case 'P':
            currentvalue = currentvalue + 3;
            break;
        case 'F':
        case 'H':
        case 'V':
        case 'W':
        case 'Y':
            currentvalue = currentvalue + 4;
            break;
        case 'K':
            currentvalue = currentvalue + 5;
            break;
        case 'J':
        case 'X':
            currentvalue = currentvalue + 8;
            break;
        case 'Q':
        case 'Z':
            currentvalue = currentvalue + 10;
            break;

        }


    }

    //printf("%d", currentvalue);
    return currentvalue;
}
4

3 に答える 3

2

あなたがすでに回答を受け入れていることは知っていますが、その長いswitch文を書かなくても済むようにする方法を示したかったのです。

values[]配列には、アルファベットの各文字のスクラブル値が含まれています。次に、letterValue()関数は文字の ASCII 値「A」を使用してvalues[]配列にインデックスを付け、文字の値を取得します。values[0] is for 'A'values[25] is for 'Z'

#include <stdio.h>
#include <string.h>
#include <ctype.h>

/* prototypes */
int wordvalue (char *userword);
int letterValue( char letter );

int values[] = { 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 letterValue( char letter )
{
    return( values[toupper((int)letter) - 'A'] );  
} 

int wordvalue(char *userword)
{
    int m;
    int currentvalue = 0;

    for (m=0; m < strlen(userword); m++)
    {
        currentvalue += letterValue( userword[m]);
    }
    return currentvalue;
}

int main()
{
    char word[] = "Progress";

    printf("Value of %s is %d\n", word, wordvalue(word));
    return( 0 );
}
于 2012-09-14T17:49:09.163 に答える
2
int value = wordvalue(userword[8]);

この呼び出しは間違っているようです。

は、ポインターが期待される場所を渡すuserword配列であると仮定します。charcharchar

あなたはおそらくやりたいと思っていました:

int value = wordvalue(userword);
于 2012-09-14T16:59:55.570 に答える
1

がすでに初期化されている文字列の場合userwordは、次のように関数に渡す必要がありますwordvalue(userword)

あなたが持っているのはint value = wordvalue(char userword[8]).

userwordこれに関する問題の 1 つは、関数の引数内で 8 文字の配列を宣言していることです。

これを行うことで、実際には to の 8 番目の要素を渡していuserwordますwordvalue。この配列を初期化したばかりなので、の値userword[8]は不明であり、プログラムは未定義の動作を示します。

配列を初期化し、値を与える必要があります。

int wordvalue(char *userword);         //function declaration

int main(void)
{
    char userword[8] = "foobarrr";         //declare 8 char array holding an 8 character string
    int value = wordvalue(userword);       //call the function
    printf("%d", value);                   //print function output
    return 0;
}

/*function prototype here*/
于 2012-09-14T17:17:53.683 に答える