检查字符串中的字符是否为 NULL 时的缺陷

Flaw when checking if a character in the string is NULL

我在检查字符串中的特定字符是否为 NULL ('[=12=]') 时遇到问题。它给了我误报,或者我认为是这样。

在我的代码中,我想知道是否有人输入了超过 3 个或少于 2 个字符。

我试过用 NULL 代替 '[=12=]' 但它仍然给我误报。

这是我检查的内容:

int main()
{
    char* str = (char*) calloc(10,sizeof(char));
    scanf("%s",str);
    if (str[1]=='[=10=]' || str[3]!='[=10=]')
        printf("Test");
}

当我的输入多于 3 个字符或少于 2 个字符时,它给出了正确的输出 ("Test"),但当它是 2 个时,它也给出了错误的输出 ("Test")人物。它仅在正好是 3 个字符时才按预期工作。我想让它用 2 或 3 个字符工作(不输出 "Test")。

通过执行 if (str[1]=='[=12=]' || str[3]!='[=12=]'),您实质上是在检查输入是否恰好为 1 个字符长,或者 不是 3 个字符长。任何其他长度不是 3 个字符的输入都将通过 。您的代码有效,但可读性差且效率低。问题出在您未显示的代码中的其他地方。但是,要确保输入恰好是 2 或 3 个字符长,为什么不只检查索引 2 或 3 处的终止符?

if ((str[0] && str[1]) &&
    (str[2] == '[=10=]' || str[3] == '[=10=]')) // 2 or 3 letters long
   printf("OK");
else
   printf("Not OK");

或简单地使用 strlen

size_t length = strlen(str);
if (length == 2 || length == 3) printf("OK");

顺便说一句,不要在堆上分配不必要的内存。对于这么小的数组,在堆栈上分配会好得多。当您无论如何要覆盖字符串时,您甚至不需要使用 calloc 将内存清零。即使你想初始化字符串,只需 str[0] = 0; 就可以终止字符串,这就足够了,而不是浪费时间将整个数组归零

don't cast the result of malloc family in C