【问题标题】:Writing a C program that calculates average quarterly rainfall for a city?编写一个计算城市平均季度降雨量的 C 程序?
【发布时间】:2015-05-11 15:35:54
【问题描述】:

我正在为一个需要为课堂编写的程序而苦苦挣扎。我需要编写一个程序,从用户那里读取城市名称,然后要求用户输入月份,后跟逗号,然后是该月的平均降雨量。这是手头的任务:

编写一个程序,从用户那里读取有关季度的数据 某个城市的降雨量并显示在屏幕上。你的程序 必须提示用户以下信息:

  • 城市名称。您可以假设它最多为 50 个字符。

  • 每个月的降雨月份和降雨量。您可以假设,对于每个月,用户都会输入月份和 降雨在一行中接收到的值,用逗号分隔 月份长度为三个字符。

  • 以字段宽度和精度表示的输出格式。

然后,您的程序必须计算平均降雨量并生成 输出符合以下规范:

  • 显示城市名称,后跟一个空行。

  • 对于每个月降雨量值,在用户指定的字段宽度中显示左对齐的月份名称,后跟降雨量 该月显示右对齐,使用定点格式化 表示法,具有用户指定的精度,在 15 个空格的字段中 宽。

  • 最后用一个空行跟随上个月的降雨量,然后在另一行显示句子“平均降雨量:”左对齐 在用户指定的字段宽度中,然后是平均降雨量 以用户指定的定点符号右对齐 精度和 15 个空格宽。

到目前为止,这是我的代码,我正在努力让代码正确让用户输入自己的逗号,代码编译并运行,但在输入后按回车后不会打印下个月的行第一个月的详细信息,它只留下一个空行:

int main () 
{

    char cityName[50];
    char monthName[3];
    char comma;
    float aveRain = 0;
    int monthCount = 1;
    float aveResult = 0;
    int fieldWidth;
    int outputPrecision;

    puts("This program calculates the average quarterly rainfall for a given city.");
    printf("Enter the name of the city: ");

    scanf("%s" , &cityName[50]);

    while( monthCount <= 3 )
    {
        printf( "Enter the month and average rainfall of month %d: " , monthCount);
        scanf( "%s %s %f" , &monthName[3] , &comma , &aveRain);

        monthCount = monthCount + 1;
    }
}

【问题讨论】:

  • scanf("%s" , &amp;cityName[50]); 将尝试在字符串的末尾输入城市名称。试试scanf("%s" , cityName); 和这个月的同上。
  • char monthName[3]; 对于 3 个字母的月份加上终止符来说不够长。
  • @WeatherVane 所以我必须将 3 改为 4?
  • 不仅如此:您需要将月份和降雨量设为数组,例如 char monthName[3][4](季度年为 3,字符串大小为 4,这是不安全的,但问题是假设输入了 3 个月份的字母,即字符串不会溢出)。还有一个降雨数组float aveRain[3]
  • 我建议你研究数组这个话题。

标签: c average formatted-input


【解决方案1】:

你的 scanf

  • 你声明char monthName[3](只有2个字符和终止的null)并在&amp;monthName[3]读取就在数组的末尾:未定义的行为
  • 您尝试在 char 中使用 %s 读取:因为 %s 读取至少一个字符并写入终止 null,这里您再次使用 UB 写入 anywhere

你应该改为:

  • 声明 char monthName[4] 为终止 null 留出空间
  • cr = scanf("%3s,%f", monthName, &amp;aveRain);以便:
    • 将输入限制为最多 3 个字符,monthName 中为空
    • 处理逗号
    • 能够控制您是否正确扫描了 2 个字段,或者在输入出现问题时中止并显示错误消息

顺便说一句,前面的 scanf 也很糟糕:您必须读取 in char 数组,而不是 它:

scanf("%49s" , cityName); 

【讨论】:

  • 我将数组 monthName[3] 更改为 monthName[4] 并省略了调用数组的 scanf 函数中的大括号,但仍然不想继续到第 2 个月?
  • @JanAdriaanBoshoff :您之前至少还有另一个问题。查看我的编辑。
  • 好的,所以我也更改了它,但它仍然不想在运行时移动到第二个月?
  • @JanAdriaanBoshoff \n 不应该是输入格式。但现在它可以在我自己的盒子上运行(即使还有一些工作可以满足全部要求:-))
  • 终于,我把它移到了接下来的几个月,非常感谢!!!现在我终于可以继续了……
猜你喜欢
  • 1970-01-01
  • 2012-01-07
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多