我正在尝试从一维二维字符串数组中获取一维数组以等于特定字符串。我已经附加了代码,但无法弄清楚如何正确使用strncpy
或strcpy
。在我的示例中,我试图获取ColdestLake
以包含其年平均温度最冷的湖泊的名称。我正在尝试从湖泊名称Lakes[6][12]
的数组中提取此名称。从数学上讲,它应该是苏必利尔湖,所以我希望“ Superior”成为ColdestLake
的值。我正在尝试用WarmestLake
完成相同的任务。我已经编写了显示温度的正确代码。我已附上返回值的照片(针对此特定代码)
感谢您的时间,因为我是C编程新手。
下面的代码:
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
int main ()
{
FILE *input;
int i, j;
char Lakes[6][12] = {"Superior", "Michigan", "Huron", "Erie", "Ontario", "St. Claire"}, ColdestLake[12], WarmestLake[12];
double Sums[7], Averages[7], Superior[365], Michigan[365], Huron[365], Erie[365], Ontario[365], St_Claire[365];
double ColdestTemperature, WarmestTemperature;
//Initializing The Input Data File
input = fopen("Lake Data.txt", "r");
//Assigning Data From File To Array's Of Each Lake
while (!feof(input))
{
for (i = 0; i < 365; i++)
{
fscanf(input, "%*lf %*lf %lf %lf %lf %lf %lf %lf", &Superior[i], &Michigan[i], &Huron[i], &Erie[i], &Ontario[i], &St_Claire[i]);
}
}
//Getting Sum Of Each Lake's Temperature
for (i = 0; i < 365; i++)
{
Sums[0] += Superior[i];
Sums[1] += Michigan[i];
Sums[2] += Huron[i];
Sums[3] += Erie[i];
Sums[4] += Ontario[i];
Sums[5] += St_Claire[i];
for (j = 0; j < 6; j++)
{
Sums[6] += Sums[j];
}
}
//Getting Average Of Each Lake's Temperature
Averages[0] = Sums[0]/365;
Averages[1] = Sums[1]/365;
Averages[2] = Sums[2]/365;
Averages[3] = Sums[3]/365;
Averages[4] = Sums[4]/365;
Averages[5] = Sums[5]/365;
//Getting Average Of All Lakes
for (i = 0; i < 6; i++)
{
Averages[6] += Averages[i]/6;
}
//Printing Average Of Each Lake's Temperature
for (i = 0; i < 6; i++)
{
printf("The Average For Lake %s Was %.2lf Degrees Celsius.\n",Lakes[i], Averages[i]);
}
//Printing The Average Of All The Lakes
printf("\nThe Average Of All The Lakes Was %.2lf Degrees Celsius.\n", Averages[6]);
//Calculating Warmest And Coldest Lakes
ColdestTemperature = Averages[0];
WarmestTemperature = Averages[0];
for (i = 0; i < 6; i++)
{
if (Averages[i] < ColdestTemperature)
{
ColdestTemperature = Averages[i];
strcpy(ColdestLake, Lakes[i]);
}
if (Averages[i] > WarmestTemperature)
{
WarmestTemperature = Averages[i];
strncpy(WarmestLake, Lakes[i], 12);
}
}
//Printing Warmest And Coldest Lakes
printf("The Coldest Lake Was: %s With A Temperature Of %.2lf\n", ColdestLake, ColdestTemperature);
return(0);
}
如果最冷的湖是苏必利尔湖,则测试if (Averages[i] < ColdestTemperature)
将不成立,因为您已将ColdestTemperature
初始化为Averages[0]
。简单的解决方案是将ColdestLake
初始化为Lakes[0]
。并对WarmestLake
执行类似操作。
并且完成此操作后,无需在循环中检查Averages[0]
,因此可以在i = 1
处开始循环。
//Calculating Warmest And Coldest Lakes
ColdestTemperature = Averages[0];
strcpy(ColdestLake, Lakes[0]);
WarmestTemperature = Averages[0];
strcpy(WarmestLake, Lakes[0]);
for (i = 1; i < 6; i++)
{
if (Averages[i] < ColdestTemperature)
{
ColdestTemperature = Averages[i];
strcpy(ColdestLake, Lakes[i]);
}
if (Averages[i] > WarmestTemperature)
{
WarmestTemperature = Averages[i];
strcpy(WarmestLake, Lakes[i]);
}
}
关于:
Sums[0] += Superior[i];
和类似的陈述...
数组Sums[]
尚未初始化,因此在数学语句中将未初始化的值用作“源”。这导致未定义的行为。
建议更改:
double Sums[7],...
至:
double Sums[7] = {0}, ...
OT:为便于阅读和理解:请遵循公理:每行仅一个语句,并且(最多)每个语句一个变量声明。
所发布的代码包含“魔术”数字365。“魔术”数字是没有基础的数字。 “魔术”数字会使代码更难以理解,调试等。建议使用#define
或enum
语句为该“魔术”数字赋予一个有意义的名称,然后在整个代码中使用该有意义的名称。
请阅读:why while(!feof( file ) ) is always wrong
关于:
Averages[6] += Averages[i]/6;
这正在使用Averages[6]
的来源。但是,该值从未初始化,从而导致未定义的行为。建议更改:
..., Averages[7],
至:
..., Averages[7] = {0},
关于:
ColdestTemperature = Averages[0];
WarmestTemperature = Averages[0];
for (i = 0; i < 6; i++)
{
if (Averages[i] < ColdestTemperature)
{
ColdestTemperature = Averages[i];
strcpy(ColdestLake, Lakes[i]);
}
以上内容将永远不会用“高级”更新ColdestLake
,因为平均值永远不会小于ColdestTemperature
的初始值。类似的考虑因素,用于计算WarmestTemperature
。
建议替换:
ColdestTemperature = Averages[0];
WarmestTemperature = Averages[0];
with:
ColdestTemperature = DBL_MAX;
WarmestTemperature = DBL_MIN;
在头文件中定义:limits.h