理解C语言中的字母或数字函数检查

理解C语言中的字母或数字函数检查,c,character,C,Character,这些函数检查什么 据我所知,他们应该检查一个单词是否包含非字母数字字符。 我不明白它是怎么做到的 我的理解是: 第一个检查是长度-这是确定的 第二个检查是字符是否为字母: isleter(符号[0])计算结果为FALSE。这在逻辑上是否定的 第三个功能与上述相同 我不明白的是,第四个: isleterordigit(*symbol)) 它如何检查单词是否包含非字母数字字符 守则: int IsSymbolValid(char* symbol) { int len = strlen(s

这些函数检查什么

据我所知,他们应该检查一个单词是否包含非字母数字字符。 我不明白它是怎么做到的

我的理解是:
  • 第一个检查是长度-这是确定的
  • 第二个检查是字符是否为字母:
  • isleter(符号[0])
    计算结果为FALSE。这在逻辑上是否定的
  • 第三个功能与上述相同
我不明白的是,第四个:
isleterordigit(*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));
}
int IsSymbolValid(字符*symbol)
{
int len=strlen(符号);
如果((len==0)| |(len>MAX_符号大小))
{
strcpy(LastParsingError,“无效符号长度”);
返回0;
}
如果(!Isleter(符号[0]))
{
strcpy(LastParsingError,“符号名称必须以字母开头”);
返回0;
}
而(*符号!=0)
{
if(IsleterOrdigit(*符号))
{
strcpy(LastParsingError,“符号名只能包含字母和数字”);
返回0;
}
++象征;
}
返回1;
}
int-IsLetter(字符-字符)
{

return(((ch>='a')&&&(ch='a')&&(ch='0')&&(ch您的困惑来自于这个函数确实是错误的:

int IsLetterOrDigit(char ch)
{
    return (IsLetter(ch) && IsDigit(ch));
}
&&
显示逻辑与,而字符不能既是数字又是字母。它应该使用
|
(逻辑或):


当我们使用它时,似乎在使用它的地方也有一个bug:

if (IsLetterOrDigit(*symbol))
{
    strcpy(LastParsingError, "Symbol name can contain only letters and digits");
    return 0;
}
如果字符是而不是字母或数字,您可能希望出现错误。因此(请注意
):


您的困惑来自这样一个事实,即该函数确实是错误的:

int IsLetterOrDigit(char ch)
{
    return (IsLetter(ch) && IsDigit(ch));
}
&&
显示逻辑与,而字符不能既是数字又是字母。它应该使用
|
(逻辑或):


当我们使用它时,似乎在使用它的地方也有一个bug:

if (IsLetterOrDigit(*symbol))
{
    strcpy(LastParsingError, "Symbol name can contain only letters and digits");
    return 0;
}
如果字符是而不是字母或数字,您可能希望出现错误。因此(请注意
):


请注意调用IsleterOrdigit的循环。为什么你要进行不必要的重新发明?到底是谁编写了自己的函数而不是使用isdigit()
或isalpha()呢
中的
?@Shahbaz:你的答案无效。你有没有看到初学者更频繁地重写strcpy?@H2CO3,有人想?也许是为了帮助他们理解?请注意围绕调用
IsleterOrdGit
的循环。你为什么不恰当地进行重新设计?到底是谁编写了自己的函数而不是使用e> isdigit()
isalpha()
来自
?@Shahbaz:你的答案无效。你看到初学者经常重写strcpy吗?@H2CO3,有人想?也许是为了帮助他们理解?
(!symbol!=0){if(!IsleterOrdigit(*symbol)){strcpy(LastParsingError,“符号名称只能包含字母和数字”);返回0;}int-IsleterOrdigit(char-ch){return(Isleter(ch)&&IsDigit(ch));}
因此,如果我这样写,只有当字符不是ABC而不是数字时,strcpy才会被激活。对吗?@Yuval,不,你完全忽略了我的第一个修复。另外,看看,这有助于你的理解。我知道它不能同时是数字和数字,这就是为什么它永远不能返回1,但如果它们都不是nu,它可以返回0mbers而不是chars。如果你把| |放进去,它总是会返回1。不?如果它既不是数字也不是字符,那么
|
将返回0,因为
0 | | 0=0
。在我的最后一句话中有德摩根定律:
不是数字,也不是字符=不是(数字或字符)
而(*symbol!=0){if>(!IsleterOrdigit(*symbol)){strcpy(LastParsingError,“符号名称只能包含字母和数字”);返回0;}int IsleterOrdigit(char ch){return(IsLetter(ch)和&IsDigit(ch));}
因此,如果我这样写,只有当字符不是ABC而不是数字时,strcpy才会被激活。对吗?@Yuval,不,你完全忽略了我的第一个修复。另外,看看,这有助于你的理解。我知道它不能同时是数字和数字,这就是为什么它永远不能返回1,但如果它们都不是nu,它可以返回0mbers而不是chars。如果你把| |放进去,它总是会返回1。不?如果它既不是数字也不是字符,那么
|
将返回0,因为
0 | | 0=0
。在我的最后一句话中有德莫根定律:
不是数字,也不是字符=不是(数字或字符)