【问题标题】:Issue in Do while statement that keeps looping itselfDo while 语句中的问题不断循环
【发布时间】:2025-12-18 21:25:03
【问题描述】:

我尝试强制用户仅在 R 、 C 或 T 之间进行选择。但我发表了声明,它不断要求我重新输入一个输入,因为它试图说给定的字母不是其中之一。另外为了验证我试图打印你好,但它没有被打印,这意味着软件仍然停留在 do while 语句。有什么帮助吗? 我的代码:

#include <stdio.h>

int main()
{
    char a;
    do 
    {
        printf ("Choisit parmis R , C ou T\n");
        scanf("%c", &a);
    } while (!((a == "R") ||(a == "T") ||(a == "C") ));
    printf("hey");
    return 0;
}

【问题讨论】:

  • 启用编译器警告。他们会告诉你这里出了什么问题。
  • 附带说明:在不检查返回值的情况下使用scanf 是不安全的。有关详细信息,请参阅此页面:A beginners' guide away from scanf()
  • @bolov 很抱歉我没有发布它们,从上面的答案中,我将字符串与不正确的字符进行比较。

标签: c loops char scanf do-while


【解决方案1】:

初学者使用

scanf( " %c", &a );
       ^^^^^

而不是

scanf( "%c", &a );
       ^^^^

否则函数也会读取空格。

"R""T""C" 是类型为 char[2] 的字符串文字。用在表达式中,除了极少数例外,它们被转换为指向char *类型的第一个元素的指针。

所以实际上您是在尝试将字符与指针进行比较。

你必须使用字符,而不是字符串文字,文字'R''T'C'

所以循环的条件看起来像

} while ( a != 'R' && a != 'T' && a != 'C' );

【讨论】:

    【解决方案2】:

    您正在将字符 a 与字符串“R”、“T”和“C”进行比较,这不是您想要的。您想与单个字符进行比较,它是这样写的:

    while (!((a == 'R') ||(a == 'T') ||(a == 'C') ));
    

    注意单引号' '是用来写字符常量的。

    【讨论】:

    • "您正在将字符 a 与字符串进行比较" -- 这不太正确。 OP 正在将字符与 指针 与字符串进行比较。
    • 非常感谢,我真的明白了,现在我有点困惑
    • 这不是代码中唯一的问题。请参阅其他两个答案(及其 cmets)以获取更多信息。
    【解决方案3】:

    看到这里有一个非常小的问题。我假设您刚刚学习了一门像 python 这样让您感到困惑的语言。在 C 中,双引号内的字符串表示字符串,而单引号内的字符串表示字符。检查这个

    var c = "C";//This is a string
    var c = 'C';//This is a char
    

    所以你正在比较一个永远不会相等的字符串和字符
    至于你的代码,写

    #include <stdio.h>
    
    int main()
    {
        char a;
        do 
        {
            printf ("Choisit parmis R , C ou T\n");
            scanf("%c", &a);
        } while (!((a == 'R') ||(a == 'T') ||(a == 'C') ));
        printf("hey");
        return 0;
    }
    

    【讨论】:

    • 如果可行,请给答案点赞,并通过单击答案旁边的勾号将其设为绿色来接受答案
    • 我会成为我的朋友
    • @Darsin_Mandona:有关更多信息,请参阅以下帮助页面:What should I do when someone answers my question?
    • 我不赞成这个答案,因为如果用户第一次输入错误的字符,scanf 将匹配第二次函数调用中的换行符。有关此问题的解决方案,请参阅 Vlad 的答案。如果你编辑你的问题来解决这个问题,我会投赞成票。