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


  编写一个程序来从用户那里读取有关每个季度的数据
  某个城市的降雨并在屏幕上显示。你的程序
  必须提示用户以下信息:
  
  
  城市名称。您可以假设它最多为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不好:


您声明char monthName[3](仅2个字符和终止的null),并在数组结尾之后在&monthName[3]处读取:未定义行为
您尝试使用char中的%s进行读取:因为%s读取至少一个字符并写入终止的null,在这里您再次使用UB编写任何内容


您应该改为:


声明char monthName[4]为终止null留出空间
cr = scanf("%3s,%f", monthName, &aveRain);以便:

将输入限制为最多3个字符,monthName中为空
处理逗号
输入出现问题时,能够控制您正确扫描了2个字段或中止并显示错误消息



顺便说一句,前面的scanf也是不好的:您必须读入char数组,而不是在它之后:

scanf("%49s" , cityName);

08-19 18:49