【问题标题】:C program only running the first loop and then stoppingC程序只运行第一个循环然后停止
【发布时间】:2021-04-12 16:33:41
【问题描述】:

每次我尝试运行时,只运行第一个循环。它询问售出了多少商品,然后停止运行。我不确定我做错了什么。如果有人有任何很棒的提示(如果有一些格式问题,那么我不会让我在没有他们的情况下发布问题)。

其他一切看起来都很好,但如果有任何其他改进,请告诉我。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int digit(char term[])
{
    int i = 0;
    int val = 0;
    while (term[i] != '\0')
    {
        val = val * 10 + term[i] - '0';
        i++; 
    } 
    return val;
}

void error()
{
    printf("Error: Sales figures must be numbers.\n");
    printf("Please try again.\n");
}

bool isnumber(char term[])
{
    int i = 0;
    while (term[i])
    {
        if( isdigit(term[i]) == 0)
        {
            return false;
            i++;
        }    
    }
    return true;
}

int main()
{
    int sales[3][2], costs[3] = {3, 4, 1}, weekends[2] = {0, 0};

    int i, j, val;

    char term[100];

    while (1)
    {
        printf("Number of Bagel sales on Saturday: ");
        scanf("%s", term);
        if( isnumber(term) == false)
        {
            error;
        }
        else
        {
            sales[0][0] = digit(term);
            break;
        }
    }
    
    while (1)
    {
        printf("Number of Flatbread sales on Saturday: ");
        scanf("%s", term);
        if( isnumber(term) == false)
        {
            error;
        }
        else
        {
            sales[1][0] = digit(term);
            break;
        }
    }
    
    while (1)
    {
        
        printf("Number of Muffin sales on Saturday: ");
        scanf("%s", term);
        if (isnumber(term) == false)
        {
            error;
        }
        else
        {
            sales[2][0] = digit(term);
            break;
        }
    }
    
    while (1)
    {
        printf("Number of Bagel sales on Sunday: ");
        scanf("%s", term);
        if( isnumber(term) == false)
        {
            error;
        }
        else
        {
            sales[0][1] = digit(term);
            break;
        }
    }
    
    while (1)
    {
        printf("Number of Flatbread sales on Sunday: ");
        scanf("%s", term);
        if( isnumber(term) == false)
        {
            error;
        }
        else
        {
            sales[1][1] = digit(term);
            break;
        }
    }
    
    while (1)
    {
        printf("Number of Muffin sales on Sunday: ");
        scanf("%s", term);
        if( isnumber(term) == false)
        {
            error;
        }
        else
        {
            sales[2][1] = digit(term);
            break;
        }
    }
    
    for (i = 0; i < 2, i++;)
    {
        for (j = 0; j < 3, j++;)
        {
            weekends[i] += costs[j] * sales[i][j];
        }
    }
    
    printf("\n");
    for (i = 0; i < 3, i++;)
    {
        printf("%d", costs[i]);
        
    }
    printf(".");
    for (i = 0; i < 3, i++;)
    {
        for (j = 0; j < 2, j++;)
        {
            printf("%d", sales[i][j]);
        }
        if (i == 0)
        {
            printf(" = ");
            printf("%d %d", weekends[0], weekends[1]);
        }
        printf("\n    ");
    }
    
    printf("\nTotal sales on Saturday: $%d", weekends[0]);
    printf("\nTotal sales on Sunday: $%d", weekends[1]);
    printf("\nTotal sales over the weekend: $%d", weekends[0] + weekends[1]);
    return 0;
}

【问题讨论】:

  • error; 不是有效的函数调用。
  • 详细说明尤金的评论,应该是error();而不是error;
  • 使用调试器,逐句单步调试你的代码,问题就会很明显。
  • isnumber() 中有一个无限循环,因为它永远不会增加 i

标签: c


【解决方案1】:

isnumber() 中有一个无限循环。如果第一个字符不是数字,它将返回 false。但是如果第一个字符是数字,它永远不会递增i,所以它会不断重复测试第一个字符。

i++ 不应出现在 if 语句中。

bool isnumber(char term[])
{
    int i = 0;
    while (term[i])
    {
        if(!isdigit(term[i]))
        {
            return false;
        }
        i++;
    }
    return true;
}

正如其他人指出的那样,您需要将() 放在error 之后才能调用它。

【讨论】:

    【解决方案2】:

    至于你的编程停止;你在第 30 行使用 isdigit 而不声明它。

    除此之外,您在任何地方都使用error 而不调用它。使用error()调用函数并打印错误信息。

    还有一个小小的格式化提示:不要使用if (something == false),而是使用if (!something)

    【讨论】:

      【解决方案3】:

      您对error; 的使用不正确。你应该改写error();

      【讨论】:

      • 试过这样做,不幸的是我仍然遇到同样的错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      • 2017-03-16
      相关资源
      最近更新 更多