【问题标题】:How to Compare char array with char in C language如何在 C 语言中比较 char 数组和 char
【发布时间】:2021-11-26 04:57:36
【问题描述】:

以下代码有什么问题?
我被困在 do while 循环中。我比较性格错了吗?我也尝试使用scanf("%c", &answer);,但结果相同

char answer[10];

    for (i = 0; i < wish; i++)
    {
        /* ... */
        /* ... */
    
        do
        {
            printf(" Does this item have financing options? [y/n]:");
            scanf("%s", &answer[i]);
        
            if ((answer[i] != 'y' )|| (answer[i] != 'n'))
            { 
                printf("\nERROR: Must be a lowercase 'y' or 'n'");
            }
        } while ((answer[i] != 'y') || (answer[i] != 'n'));

【问题讨论】:

  • 逻辑错误。测试将永远为真。
  • 也许您的意思是检查answer[i] 是否不是'y' 并且 (&amp;&amp;) 不是'n'
  • 我很抱歉。 y 是包含“y”的变量,n 包含“n”。虽然我更新了帖子。但它仍然无法正常工作。
  • 但是您正在检查它是 not 'y' 还是 not 'n'。考虑如果是'y'会发生什么:那么第一个条件为假,但第二部分为真,“假或真”为真。

标签: arrays c char


【解决方案1】:

您被困在循环中,因为您继续循环的条件始终为真。
如果您看不清楚,请尝试命名一个既不与“y”不同也不与“n”不同的字母。
以“a”为例,两者都不同。
以“n”为例,它与“n”没有区别,但与“y”不同。
以“y”为例,它与“n”不同,但与“y”并无不同。

所以无论输入什么字母,循环都会继续。

要解决,请使用 Chris 的评论并更改为

((answer[i] != 'y' ) && (answer[i] != 'n'))

这样,“n”或“y”以外的任何其他字母都将不同于“n”并且不同于“y”并将继续循环,而“y”和“n”都将不同于至少两者之一并结束循环。

一旦你得到了正确的条件,它可能只需要一次,即只在循环中。至少在所示代码中不需要额外的if。除了您在此处显示的内容之外,您可能还有需要它的代码。

【讨论】:

  • 另外值得注意的是,删除不必要的括号仍有改进的余地。 (answer[i] != 'y' ) &amp;&amp; (answer[i] != 'n') 等价于 answer[i] != 'y' &amp;&amp; answer[i] != 'n'
  • 另外,我认为您的意思是:以“n”为例,它与“n”没有区别,但与“y”不同。
  • 感谢您的意见。我在这里不讨论() 的必要性,因为编码规则(以及我自己的观点)支持直言不讳地说明逻辑的含义,即使运算符优先级已经使编译器清楚.
  • 这是一个公平的观点。我的看法是,额外的视觉“噪音”通常会降低理解程序的能力。
  • 这是一个公平的观点。然而,习惯会影响被认为是噪音的东西。幸运的是,我碰巧接受了符合我必须遵循的规则的培训。 ;-)
【解决方案2】:

在 @Yunnosch 的出色回答的基础上,我们可以通过另一种方式来查看检查某些内容是否不是一组字符的逻辑。

我们可以把它看作是检查一个字符是否不是'y' 并且不是'n'

answer[i] != 'y' && answer[i] != 'n'

或者...我们可以检查它是'y'还是'n'

answer[i] == 'y' || answer[i] == 'n'

然后简单地否定它!

!(answer[i] == 'y' || answer[i] == 'n')

另一种选择

另一种看待这个问题的方法是,因为char 是一种数字类型,所以使用开关。

switch (answer[i]) {
    case 'y':
    case 'n':
    /* Do whatever happens when there is a valid input */
    break;
   
    default:
    printf("\nERROR: Must be a lowercase 'y' or 'n'");
}

在这里使用 switch 唯一真正的好处是它可以很容易地检查大写 y 和 n 之类的东西:

switch (answer[i]) {
    case 'y': case 'Y':
    case 'n': case 'N':
    /* Do whatever happens when there is a valid input */
    break;
   
    default:
    printf("\nERROR: Must be a lowercase 'y' or 'n'");
}

【讨论】:

  • 很高兴听到这个消息!当您觉得您的问题已得到解答时,最好在 SO 上接受您认为有帮助的任何答案,并且您可能希望对它们进行投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 2021-12-06
相关资源
最近更新 更多