【问题标题】:conditions in if statement in C not working while using &&, despite working separately [closed]尽管单独工作,但 C 中的 if 语句中的条件在使用 && 时不起作用 [关闭]
【发布时间】:2020-10-08 18:59:57
【问题描述】:

我的 if 语句有两个条件。该语句在两个嵌套的for循环内,如下:

 for(int i = 0; i < LENGTH; i++)
{
    for(char j = 'a'; j <= 'z'; j++)
    {
        if((strcasecmp(&word[0], &j) == 0) && (strlen(word) == i))
        {
            //code here
        }
    }
}

(word 是一个 const char *,length 是一个定义为 45 的常数)。

如果条件只包含这两个条件之一,则在两个条件之一运行时返回true,因此它们分别为true。但是,当我像这样将它们放在一起时,它会返回 false。

有人知道为什么会这样吗?

【问题讨论】:

  • 您不能将&amp;j 传递给strcasecmp,因为它不是以null 结尾的字符串。这会触发未定义的行为,从那时起谁知道会发生什么。
  • if 条件以惰性方式进行评估,因此如果您的条件是“and”序列,它将在第一个条件评估为 false 而不评估休息。以类似的方式,如果您的条件是“或”序列,它将在第一个条件评估为 true 时返回 true
  • 无论如何,这种比较似乎没有多大意义。即使&amp;j 是一个字符的字符串,strcasecmp 也会在word 包含多个字符的任何时候返回非零值。 &amp;word[0]word 意思相同;您似乎认为您只是在比较第一个字符,但事实并非如此。
  • 我认为如果您能提供更多上下文(包括周围的代码)并解释这段代码的实际用途,将会有所帮助。

标签: c string if-statement c-strings


【解决方案1】:

正如在 cmets 中观察到的,这个函数调用是不明智的:

strcasecmp(&word[0], &j) == 0)

因为&amp;j 不是指向以空字符结尾的字符串的指针。此外,如果word 是指向const char 的有效指针,那么&amp;word[0] 是不必要的钝化,因为它仅相当于word

我直觉您正在寻找的是word 的第一个字符与j 的值的大小写比较。由于j 在此范围内的值始终为小写 ASCII 字母,因此最好在此条件下实现:

tolower(word[0]) == j

【讨论】:

    【解决方案2】:

    strcasecmp 的每个参数都需要一个指向以 null 结尾的字符串的指针。第一个参数很好,因为它与word 相同。但是,第二个不是因为您将指针传递给单个字符。该函数将尝试将其视为字符串并读取单个字符的内存边界。这会导致undefined behavior

    看起来您确实想以不区分大小写的方式将单个字符与字符串中的一个字符进行比较。您可以使用tolower 函数将单个字符转换为小写字母以与小写字符进行比较,并将其用于字符串的每个元素:

    if (tolower(word[i]) == j)
    

    【讨论】:

      猜你喜欢
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多