我正在为上课编写的程序而苦苦挣扎。我需要编写一个程序,从用户那里读取城市的名称,然后要求用户输入月份,然后输入逗号,然后输入该月的平均降雨量。这是手头的任务:
编写一个程序来从用户那里读取有关每个季度的数据
某个城市的降雨并在屏幕上显示。你的程序
必须提示用户以下信息:
城市名称。您可以假设它最多为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);