【问题标题】:I am getting this warning "comparison of constant ‘10’ with boolean expression is always true"我收到此警告“常量‘10’与布尔表达式的比较总是正确的”
【发布时间】:2020-10-28 07:55:53
【问题描述】:

我无法通过输入换行符退出循环。

int input(char str[], int n)
{
    int ch, i = 0;
    while ((ch == getchar()) != '\n')
        if (i < n)
            str[i++] = ch;
    str[i] = '\0';
    return i;
}

【问题讨论】:

  • ch == getchar() 是一个布尔表达式。它等于 0 或 1,并且永远不会等于 '\n'(即 10)。你的意思可能是ch = getchar()
  • 这里的主要函数: int main() { char str[100]; int n = 输入(str,5); printf("%d %s", n, str); }
  • @Bloodknofsky 不要将代码放在评论中,而是 edit 您的问题并在那里进行所有说明。
  • 您的...问题中没有问题...您的问题是警告还是您无法摆脱困境的事实?请编辑您的帖子。

标签: c loops


【解决方案1】:

只需将== 替换为=,因为您想将getchar() 分配给ch 而不是比较它。

int input(char str[], int n)
{
    int ch, i = 0;
    while ((ch = getchar()) != '\n'){
        if (i < n)
            str[i++] = ch;
    }
    str[i] = '\0';
    return i;
} 

【讨论】:

    【解决方案2】:

    你忘记了代码中的{ 符号。任何多条指令行的控制结构,例如whileif,都应该这样编码:

    while(condition){
      instruction 1;
      instruction 2;
      ...
    }
    

    顺便说一句,您的 i 始终为 0,而您的 n 在您的函数中不会改变。

    编辑:您获得警告的原因已被其他人回答。

    【讨论】:

    • 在这种情况下实际上不需要括号,因为str[i++] = ch; 属于唯一的if 语句。虽然我个人也推荐这种风格。
    • 确实,所以我写了“控制结构......不止一行”。他似乎根本不知道规则,所以我认为解释它是个好主意。
    【解决方案3】:
    (ch == getchar())
    

    您使用== 而不是=

    == 用作布尔运算符,用于检查左侧操作数是否等于右侧操作数。

    因此,循环将永远不会终止,因为您比较了01(这是(ch == getchar())\n 的结果,\n 的ASCII 值为10

    这就是错误的意思。

    =用于赋值,需要将getchar()获取的字符赋值给ch


    这是修正版:

    while ((ch = getchar()) != '\n') {
         if (i < n)
         str[i++] = ch;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      • 2022-11-28
      • 1970-01-01
      相关资源
      最近更新 更多