【问题标题】:Why won't my while loop execute its function when the condition is met? [duplicate]为什么当条件满足时我的while循环不执行它的功能? [复制]
【发布时间】:2019-10-01 22:47:42
【问题描述】:

我正在尝试制作一个非常简单的 while 循环作为测试。本质上,while 循环中的语句询问您是否要继续。如果你输入了正确的字符,它应该会再次问你同样的问题。如果输入任何其他字符,则不应再满足 while 循环的条件,应退出 while 循环。但是,循环一次都没有执行,程序一开始就立即结束。这让我觉得我的条件有问题,但据我所知是满足的。

我尝试过仅使用整数作为条件来构建 while 循环(只要变量不等于特定值,循环就会运行。一旦变量等于值,循环结束。)该程序成功运行,但我无法让这个类似的代码使用字符作为输入来同样工作。

这是我的行号不起作用的代码:

#include <stdio.h>

void main(void)
{
    char word="a";
    while(word == "a") 
    {   
        printf("\ntest. enter a to continue");
        scanf("%c", &word);
    }
}

我的期望:

test. enter a to continue

在我输入“a”之后,同样的语句应该重复,如果输入其他任何内容,程序应该结束

我实际得到的:

--------------------------------
Process exited after 0.6154 seconds with return value 4210688
Press any key to continue . . .

这是我从任何成功的程序完成后得到的,但我想要的输出高于虚线。在这种情况下,虚线上方没有输出,这意味着程序结束时根本没有输出。

我没有错误消息,但有以下警告消息:

[Warning] initialization makes integer from pointer without a cast (line 5)
[Warning] comparison between pointer and integer  (line 6)

【问题讨论】:

  • word 是一个字符,“a”是一个字符串。试试 'a'(它实际上是一个 int,但会比较相等)。
  • 在你的 C 编程生涯的这个阶段,你应该假设如果编译器打算给你一个警告,它已经在你的代码中发现了一个你必须修复的错误——它知道更多关于C比你做的。几年后,您可能会决定忽略一些更神秘的警告(也许;我只用 C 语言编码 30 多年,我很少冒这种风险),但我立即意识到像那些警告您显示的内容很重要,必须在运行代码之前修复。 (我主要使用 GCC 并且通常使用 -Werror 以便将任何警告视为错误。)
  • 一旦程序完全循环,您可能需要在scanf() 中使用" %c"% 之前有一个空格)。这将跳过换行符;如所写,如果您键入a(并返回),则循环将在scanf() 读取返回(换行符)字符时停止。空格会跳过空格,例如空格、制表符和换行符。

标签: c


【解决方案1】:

这些警告不仅仅是警告 - 它们是您的程序无法运行的原因。将程序中两个位置的 "a" 更改为 'a' 以使用字符文字而不是字符串,您将被设置。

【讨论】:

    【解决方案2】:

    比较字符串最好使用strcmp

    编辑

    比较字符串一般最好使用strcmp

    此代码解释了如何在 OP 询问的特定情况下使用它:

    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
       const char *initial_word = "a";
       char next_word [] = "b";
    
       const char *compare = "a";
       int condition = strcmp(initial_word, compare); //return 0 -> true
    
       while(condition == 0)
       {
            printf("Test: enter a to continue: \t");
            scanf("%s", next_word);
    
            if (strcmp(next_word, compare) != 0) condition = 1;
       }
    
    }
    

    【讨论】:

    • OP 没有尝试比较字符串。
    • 正在比较字符。哪个 strcmp 可以。
    • 否:strcmp() 比较以空字符结尾的字节字符串 (NTBS)。变量word 是单个字符;它不是 NTBS。在这成为一个足够有用的答案之前,您必须推荐一些其他更改。
    • 好点。我做到了。请删除反对票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 2022-01-13
    • 2021-11-25
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 2020-05-12
    相关资源
    最近更新 更多