检查字符串中的字符是否为NULL时出错

时间:2019-05-18 07:46:57

标签: c null conditional c-strings

在检查字符串中的特定字符是否为NULL'\0')时遇到问题。它给了我错误的肯定,或者我认为是这样。

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

我尝试用NULL代替'\0',但这仍然会给我带来误报。

这是我要做的检查:

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

当我的输入超过3个字符或少于2个字符时,它会给出正确的输出("Test"),但是当我的输入是2个字符时,它也会给我错误的输出("Test")。只有正好是3个字符时,它才能按预期工作。我想使用2或3个字符来使其工作(不输出“测试”)。

1 个答案:

答案 0 :(得分:2)

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

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

或仅使用strlen

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

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

还有don't cast the result of malloc family in C