0

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

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

  • 城市名称。您可以假设它最多为 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;
    }
}
4

1 回答 1

0

你的 scanf 很糟糕

  • 您声明char monthName[3](只有2 个字符和终止的 null)并在&monthName[3] 数组末尾之后读取:未定义的行为
  • 您尝试使用%schar 读取:因为%s读取至少一个字符并写入终止空值,在这里您再次使用 UB在任何地方写入

你应该改为:

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

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

scanf("%49s" , cityName); 
于 2015-05-11T15:50:50.680 回答