【问题标题】:C - scanf didn't stop for user inputC - scanf 没有停止用户输入
【发布时间】:2012-11-12 02:39:22
【问题描述】:

我想获取变量L 的用户输入,但scanf 函数不起作用,如果我尝试输入任何内容,程序将跳转并打印下一个成本语句并退出。 我是C新手,希望能在这里得到一些帮助。谢谢。代码如下:

 #include <stdio.h>
 #include <conio.h>

 int main()
 {
    float L = 0; // L is litre
    float gallon;
    gallon = 3.785 * L;
    char x[2] = {'u', 'd'}; // u is unleaded and d is diesel
    float cost;
    printf("Hello, welcome to PetrolUpHere!!\n");
    printf("Would u like unleaded or diesel fuel?");
    scanf("%s", &x[2]);
    printf("Enter the litre you want to fuel:");
    scanf("%.2f", &L); //SCANF NOT WORKING
    switch (x[2]) {
        case 'u':
            cost = 1.98 * gallon;
            printf("The cost is :%.2f ", cost);
            break;
        case 'd':
            cost = 1.29*gallon;
            printf("The cost is :%.2f ",cost);
            break;
    }
    getch();
    return 0;
}

【问题讨论】:

  • x 是一个包含 2 个字符的数组,但您将其视为 2D 字符数组。

标签: c printf scanf


【解决方案1】:

这里有很多问题:

scanf("%s", &x[2]);

我想你想将一个字符串读入变量x。相反,您是在说“将字符串读入内存 2 个位置,超过 x 指向的位置”。在这种情况下,内存将超出范围。你应该这样做,因为你只关心一个角色:

char input;
scanf("%c", &input);

您的switch 声明同样被破坏; x[2] 再次超出范围。请改用上述代码中的input

正如其他人指出的那样,使用%.2f 不是您在阅读 L 时想要做的事情。请改用%f。通常,您应该只在打印出变量时使用格式说明符,而不是读入它们。最终您将不会使用scanf,因为它不是一种特别安全的输入方式。

最后:您对 C 字符串如何工作的理解充其量似乎是不稳定的。这是可以理解的,因为对于以前没有使用过 C 的任何人,尤其是对于新手程序员来说,这是一个相当混乱的话题。这是one explanation;我相信你可以找到更多,如果你看的话,可能会更好。

【讨论】:

  • 问题已解决,谢谢。但是现在出现的问题是程序无法计算成本并仅打印成本= 0.0000。希望能得到帮助。谢谢
  • 请针对这个新问题提出一个新问题,并在其中包含您更新的代码。
  • “最终你无论如何都不会使用 scanf...”,你说的那个 Chris 是什么意思
【解决方案2】:

在您的大部分代码中存在三个问题(至少):

char x[2] = {'u', 'd'};//u is unleaded and d is diesel
float cost;

printf("Hello, welcome to PetrolUpHere!!\n");
printf("Would u like unleaded or diesel fuel?");
scanf("%s", &x[2]);
printf("Enter the litre you want to fuel:");
scanf("%.2f", &L); //SCANF NOT WORKING

switch (x[2]) {
  1. x 是一个由 2 个 char 组成的数组,它已初始化,但不是以空字符结尾的字符串。
  2. 您使用scanf("%s", &amp;x[2]),它将字符串读入不属于数组x 的数据中。
  3. 然后您在 switch 语句中取消引用 x[2] — 再次访问超出范围的数据。
  4. 您无需检查scanf() 调用以确保它能够扫描结果。
  5. 您不会在阅读后立即打印所阅读的内容。
  6. scanf() 格式中的. 无效;使用"%f"(您可能不想使用"%2f",因为这会将您限制为最多两位数)。
  7. 您实际上并未说出您在回答“无铅或柴油”问题时输入的内容。

【讨论】:

    【解决方案3】:

    scanf("%s", &amp;x[2]); 应该: scanf("%c", &amp;x[2]);


    scanf("%.2f", &amp;L); 应该: scanf("%2f", &amp;L);

    你用'0.0'初始化加仑,那么你的输出将永远是'0.0'。 希望它有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多