0

それらの関数は何をチェックしますか?

私が理解していることから、彼らは単語に英数字以外の文字が含まれているかどうかをチェックすることになっています。私はそれがこれをどのように行うのか理解していません。

私の理解:

  • 最初のチェックは長さです-これはOKです。
  • 2番目のチェックは、文字が文字であるかどうかです。
  • IsLetter(symbol[0]))FALSEと評価されます。これは論理的に否定されます。
  • 3番目の機能は上記と同じです。

私が理解していなかったのは、4番目のものです IsLetterOrDigit(*symbol))

単語に英数字以外の文字が含まれているかどうかをどのように確認しますか?

コード:

int IsSymbolValid(char* symbol)
{
    int len = strlen(symbol);
    
    if ((len == 0) || (len > MAX_SYMBOL_SIZE))
    {
        strcpy(LastParsingError, "Invalid symbol length");
        return 0;
    }

    if (!IsLetter(symbol[0]))
    {
        strcpy(LastParsingError, "Symbol name has to start with letter");
        return 0;
    }

    while (*symbol != 0)
    {
        if (IsLetterOrDigit(*symbol))
        {
            strcpy(LastParsingError, "Symbol name can contain only letters and digits");
            return 0;
        }
        ++symbol;
    }

    return 1;
}

int IsLetter(char ch)
{
    return (((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')));
}

int IsDigit(char ch)
{
    return ((ch >= '0') && (ch <= '9'));
}

int IsLetterOrDigit(char ch)
{
    return (IsLetter(ch) && IsDigit(ch));
}
4

1 に答える 1

4

あなたの混乱は、この関数が実際に間違っているという事実から来ています:

int IsLetterOrDigit(char ch)
{
    return (IsLetter(ch) && IsDigit(ch));
}

&&は論理 AND を示しますが、文字は数字と文字の両方にすることはできません。使用する必要がありました||(論理 OR):

int IsLetterOrDigit(char ch)
{
    return (IsLetter(ch) || IsDigit(ch));
}

私たちがそれに取り組んでいる間、それが使用されているバグもあるようです:

if (IsLetterOrDigit(*symbol))
{
    strcpy(LastParsingError, "Symbol name can contain only letters and digits");
    return 0;
}

文字が文字でも数字でもない場合は、エラーが必要です。したがって ( に注意して!ください):

if (!IsLetterOrDigit(*symbol))
{
    strcpy(LastParsingError, "Symbol name can contain only letters and digits");
    return 0;
}
于 2013-03-18T11:56:42.483 に答える