【问题标题】:Why am I getting a wrong output in a console in C#?为什么我在 C# 的控制台中得到错误的输出?
【发布时间】:2022-01-16 16:45:11
【问题描述】:

我是学习 C# 的初学者,我正在尝试编写一个控制台应用程序,如果你说某种食物,那么你就是某种动物。

出于某种原因,无论我输入哪种食物,我总是得到相同的输出(我得到的是熊的输出)。 只有我写Pizza,我才会得到一个懒惰动物的输出。

有人可以看看这个并告诉我我哪里错了吗?而且即使我随机选择了一些.IndexOf 没有找到的食物,我仍然会得到熊动物!

Console.WriteLine("Select your favorite food and Ill tell you what kind of animal you are!");

string userInput = Console.ReadLine();
int userInput1 = userInput.IndexOf("Hamburger", 0);
int userInput2 = userInput.IndexOf("Pizza", 0);
int userInput3 = userInput.IndexOf("Tuna salad", 0);
bool hamUserInput1 = Convert.ToBoolean(userInput1);
bool pizzaUserInput2 = Convert.ToBoolean(userInput2);
bool tunaUserInput3 = Convert.ToBoolean(userInput3);

if (hamUserInput1 == true)
{
    Console.WriteLine($"Since you chose {userInput} as your food, youre a bear!");
}
else if (pizzaUserInput2 == true)
{
    Console.WriteLine($"Since you chose {userInput} as your food, youre a sloth!");
}
else if (tunaUserInput3 == true)
{
    Console.WriteLine($"Since you chose {userInput} as your food, youre a fish!");
}
else
{
    Console.WriteLine($"Since you chose {userInput} as your food, I can only say that youre a dinosaur!");
}

【问题讨论】:

  • Convert.ToBoolean(userInput1) - 高度怀疑。只需使用if(userInput.Contains("Hamburger")) 等...请记住,C# 默认情况下区分大小写。对于 case insens,如果您的 C# 版本支持,请使用 if(userInput.Contains("Hamburger", StringComparison.OrdinalIgnoreCase));如果不支持,请使用 if(userInput.IndexOf("hamburger",StringComparison.OrdinalIgnoreCase) >= 0)
  • 谢谢,我会调查一下

标签: c# boolean indexof


【解决方案1】:

IndexOf 在传递的字符串不是子字符串时返回-1

Convert.ToBoolean 在传入的 int 不为 0 时为真。

您可以使用userInput1 != -1,但String.Contains 是您想要的。

【讨论】:

  • 我不太确定你想说什么,但你是对的。我意识到 Convert.ToBoolean 对所有内容都返回 true,但为零。请看下面这个sn-p。如果 hamburger 的 bool 值为 true,如果值为 Hamburger 的 userInput 为 true,然后如果我输入 userInput == hamburger,并且从两边都为 true,那么最终结果如何等于不为 true?所以我的程序找到了 Hamburger 这个词,我将它与设置为 true 的 hamburger 进行了比较,但没有找到其他词,这意味着其他所有内容都必须是 false,只有 Hamburger 是 true,所以为什么会这样
  • ..打印出熊的部分,即使我选择了其他词。 (我听了你的建议,到处都放了!= 现在一切都打印出来了,但我不明白为什么。如果在字符串中找到了 Hamburger,则意味着它是真的,如果 bool hamburger 值设置为 true,它们给出 true . 但如果我使用 != 表示他们给出相反的结果,那将是错误的,但在这种情况下,它会在控制台中正确打印出来。为什么,哦,为什么?
  • hamUserInput1 仅当单词“Hamburger”位于字符串开头时才为true
  • 但如果我使用 != 表示他们给出相反的结果 - 因为当您使用 IndexOf 并且它确实在索引 0(开始)处找到字符串时,它返回 0,然后Convert.ToBoolean(0) 创建FALSE,这意味着 FIND,因此当您使用!= 时,它会将其反转为DOES FIND.. 这“使它看起来像它工作”,但前提是“汉堡包”字符串在开头。总而言之,我知道您已经为这些代码行流过血和泪,但它们令人困惑且不合逻辑,应该丢弃。使用Contains,编写漂亮、简单、读起来像一本书或食谱的代码
  • 永远不要害怕丢掉代码;仅仅因为我在一些代码中投入了大量时间并不意味着它很好。如果在写了一些在大多数情况下都可以工作的尴尬复杂的东西一段时间后,我突然想到了一个非常简单、可靠的方法来做这件事,但是当我在 6 个月内重新阅读一些东西时,我的理智“这是什么?是谁写的这件衣服……哦”
【解决方案2】:

你应该使用string.Contains的方法 例如 userInput.Contains("Your Food");

【讨论】:

  • 确实提供一些增强的信息;这充其量只是一条评论,甚至不如提及相同内容的现有评论提供的信息那么丰富
  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
【解决方案3】:

试试这个

    var foodAnimals = new string[,] { { "Hamburger", "bear" }, 
                        { "Piza", "sloth" }, { "Tuna Salad", "fish"} };

    Console.WriteLine("Select your favorite food and Ill tell you what kind of animal you are!");

    var userInput = Console.ReadLine();

    var animal = "dinosaur";
    for (var i = 0; i < foodAnimals.GetLength(0); i++)
    {
        if (userInput.ToLower().Contains(foodAnimals[i, 0].ToLower()))
        {
            animal = foodAnimals[i, 1];
            break;
        }
    }

    Console.WriteLine($"Since you chose {userInput} as your food, youre a {animal}!");

【讨论】:

    【解决方案4】:

    出于某种原因,无论我输入哪种食物,我总是得到相同的输出(我得到的是熊的输出)。只有当我写披萨时,我才会得到一个懒惰动物的输出。

    有人可以看看这个并告诉我我哪里错了吗?即使我选择了一些.IndexOf 没有找到的随机食物,我仍然会得到熊动物!

    好吧,让我们试试看会发生什么:

    用户输入“汉堡”

    我将用直接值替换方法调用

    string userInput = "Hamburger"; //Imagine they type Hamburger
    int userInput1 = 0;             //Hamburger found at 0 - userInput.IndexOf("Hamburger", 0);
    int userInput2 = -1;            //Pizza not found - userInput.IndexOf("Pizza", 0); 
    int userInput3 = -1;            //Tuna salad not found - userInput.IndexOf("Tuna salad", 0);
    bool hamUserInput1 = false;     //0 converted to boolean is False - Convert.ToBoolean(userInput1);
    bool pizzaUserInput2 = true     //-1 converted to boolean is True -Convert.ToBoolean(userInput2);
    bool tunaUserInput3 = true      //-1 converted to boolean is True -Convert.ToBoolean(userInput3);
    
    if (false /*hamUserInput1*/ == true)       //NOT DONE, false is not equal to true
    {
        Console.WriteLine($"Since you chose {userInput} as your food, youre a bear!");
    }
    else if (true /*pizzaUserInput2*/ == true) //DONE
    {
        Console.WriteLine($"Since you chose {userInput} as your food, youre a sloth!");
    }
    
    

    我们不需要更进一步;我们发现当我们输入 Hamburger 时,你就是个树懒!

    用户输入“披萨”

    第 2 轮,我们开始!

    string userInput = "Pizza";     //Imagine they type Pizza
    int userInput1 = -1;            //Hamburger not found - userInput.IndexOf("Hamburger", 0);
    int userInput2 = 0;             //Pizza found at 0 - userInput.IndexOf("Pizza", 0); 
    int userInput3 = -1;            //Tuna salad not found - userInput.IndexOf("Tuna salad", 0);
    bool hamUserInput1 = true;      //-1 converted to boolean is True - Convert.ToBoolean(userInput1);
    bool pizzaUserInput2 = true     //0 converted to boolean is False -Convert.ToBoolean(userInput2);
    bool tunaUserInput3 = true      //-1 converted to boolean is True -Convert.ToBoolean(userInput3);
    
    if (true /*hamUserInput1*/ == true)       //DONE
    {
        Console.WriteLine($"Since you chose {userInput} as your food, youre a bear!");
    }
    

    我们不需要更进一步;我们发现当我们输入 Pizza 时,你就是一只熊!

    用户类型“ASDF”

    第三轮,我们开始!

    string userInput = "ASDF";      //Imagine they type ASDF
    int userInput1 = -1;            //Hamburger not found - userInput.IndexOf("Hamburger", 0);
    int userInput2 = -1;            //Pizza not found - userInput.IndexOf("Pizza", 0); 
    int userInput3 = -1;            //Tuna salad not found - userInput.IndexOf("Tuna salad", 0);
    bool hamUserInput1 = true;      //-1 converted to boolean is True - Convert.ToBoolean(userInput1);
    bool pizzaUserInput2 = true     //-1 converted to boolean is True-Convert.ToBoolean(userInput2);
    bool tunaUserInput3 = true      //-1 converted to boolean is True -Convert.ToBoolean(userInput3);
    
    if (true /*hamUserInput1*/ == true)       //DONE
    {
        Console.WriteLine($"Since you chose {userInput} as your food, youre a bear!");
    }
    

    我们不需要更进一步;我们发现当我们输入 ASDF 时,你就是一只熊!


    这是您使用 VS 调试器进行的调试。你点击一行,你按 F9,你按 Play..

    ..然后代码在红点所在的那一行停止,您可以按 F10 或 F11 来推进它(分别跳过或进入方法 - 跳过仍然运行方法它只是没有'不要踏入它(如果你一直踏入它可能会非常乏味))

    您可以指向代码中的任何范围内变量并随时查看它们的值

    你会看到这个过程;输入一些东西,观察值


    直截了当,IndexOf 的Convert.ToBoolean 是一个坏主意

    • 如果 IndexOf 返回 -1 表示“未找到”,则 ToBoolean 会将其设为 true,就好像它“已找到”一样
    • 如果 IndexOf 返回 0 表示“在开始时找到”,Convert 会将此设为“未找到”
    • 如果 IndexOf 返回 1+ 表示“在中间某处找到”,Convert 会将此设为“已找到”

    所以它有时有效,但有时无效 - 这是可怕的、不可靠的代码。扔掉它

    看看这多好:

    string userInput = Console.ReadLine();
    
    if (userInput.Contains("Hamburger")){
        Console.WriteLine($"Since you chose Hamburger as your food, you're a bear!");
    
    } else if (userInput.Contains("Pizza")){{
        Console.WriteLine($"Since you chose Pizza as your food, you're a sloth!");
    }
    else if (userInput.Contains("Tuna salad")){
        Console.WriteLine($"Since you chose Tuna salad as your food, you're a fish!");
    }
    else{
        Console.WriteLine($"Since you chose {userInput} as your food, I can only say that you're a dinosaur!");
    }
    

    【讨论】:

    • 您的回复非常有帮助,非常感谢您为我的初学者大脑提供的思考!
    猜你喜欢
    • 2021-01-09
    • 2012-04-26
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 2013-10-04
    • 2022-11-28
    • 2021-11-18
    • 2019-01-25
    相关资源
    最近更新 更多