一个人如何从一个字符串数组中提取一个字符串并将其放入自己的数组中?

问题描述 投票:0回答:2

我正在尝试从一维二维字符串数组中获取一维数组以等于特定字符串。我已经附加了代码,但无法弄清楚如何正确使用strncpystrcpy。在我的示例中,我试图获取ColdestLake以包含其年平均温度最冷的湖泊的名称。我正在尝试从湖泊名称Lakes[6][12]的数组中提取此名称。从数学上讲,它应该是苏必利尔湖,所以我希望“ Superior”成为ColdestLake的值。我正在尝试用WarmestLake完成相同的任务。我已经编写了显示温度的正确代码。我已附上返回值的照片(针对此特定代码)

Here

感谢您的时间,因为我是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);
}

c arrays string
2个回答
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]);
        }
    }

0
投票

关于:

Sums[0] += Superior[i];

和类似的陈述...

数组Sums[]尚未初始化,因此在数学语句中将未初始化的值用作“源”。这导致未定义的行为。

建议更改:

double Sums[7],...

至:

double Sums[7] = {0}, ...

OT:为便于阅读和理解:请遵循公理:每行仅一个语句,并且(最多)每个语句一个变量声明。

所发布的代码包含“魔术”数字365。“魔术”数字是没有基础的数字。 “魔术”数字会使代码更难以理解,调试等。建议使用#defineenum语句为该“魔术”数字赋予一个有意义的名称,然后在整个代码中使用该有意义的名称。

请阅读: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

© www.soinside.com 2019 - 2024. All rights reserved.