【问题标题】:Flaw when checking if a character in the string is NULL [closed]检查字符串中的字符是否为NULL时的缺陷[关闭]
【发布时间】:2019-05-18 07:46:57
【问题描述】:

我在检查字符串中的特定字符是否为 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 个字符使其工作(不输出“测试”)。

【问题讨论】:

  • 您需要忽略 first 空字节之后的所有内容。例如,如果str[2]'\0',那么您不应该查看str[3],因为它包含什么并不重要。但是您应该只调用strlen(str),然后直接检查长度,而不是四处寻找空字节。
  • 是什么让您认为NULL'\0' 有某种关联?
  • "~~~ warning: format '%p' expects argument of type 'void *' ..." 您显示的代码中没有可能导致此警告的行。
  • @alk 实际上,'\0' 被称为空字符或空字节。 NUL 是字符代码缩写,有时用于表示某些字符集中的空字符。当然,NULL 是空指针,它与空字符完全无关。
  • 问题中显示的代码,一旦包含<stdio.h><stdlib.h>,如果输入短于两个或长于三个字符,则会打印“Test”。当输入是两个字符时,它不会给出“Test”的错误输出。该语句中的问题是错误的,并且无法显示实际的失败代码。

标签: c null conditional c-strings


【解决方案1】:

通过执行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");

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

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

【讨论】:

  • 谢谢!我会尝试这样做,但你知道:strlen 给我错误:警告:格式 '%p' 需要类型为 'void *' 的参数,但参数 3 的类型为 'int' [-Wformat=]|警告:格式“%p”需要“void *”类型的参数,但参数 5 的类型为“int”[-Wformat=]|
  • @AnthonyEgeKOPRİ 您对 printf 使用了错误的参数。 %p 用于指针,您正在打印int。这是另一个问题,但请先Google
  • @AnthonyEgeKOPRİ strlen() 不可能生成有关格式说明符的警告 - 它不采用任何格式说明符。您误读了诊断信息。
猜你喜欢
  • 2016-10-24
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
  • 1970-01-01
  • 2018-09-22
  • 2012-12-27
  • 2019-03-16
相关资源
最近更新 更多