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