Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将指针值读入结构数组_C_Arrays_Struct - Fatal编程技术网

C 如何将指针值读入结构数组

C 如何将指针值读入结构数组,c,arrays,struct,C,Arrays,Struct,我有以下结构 typedef struct { char* city; int temp; } Place;` 我试图从一行读入两个值到一个结构数组中 这些线条看起来像: 洛杉矶;88 我正在尝试将数据读入数组。假设我的内存分配正确,读取这些值的正确方法是什么 我的代码 void readData(FILE** fpData, FILE** fpOutput) { char s[100]; int index = 0; Place *value

我有以下结构

typedef struct
{
    char* city;
    int temp;
} Place;`
我试图从一行读入两个值到一个结构数组中

这些线条看起来像:

洛杉矶;88

我正在尝试将数据读入数组。假设我的内存分配正确,读取这些值的正确方法是什么

我的代码

    void readData(FILE** fpData, FILE** fpOutput)
{
    char s[100];
    int index = 0;

    Place *values;
    values=malloc(size * sizeof(Place));
    if (values == NULL)
    {
        MEM_ERROR;
        exit(1);
    }


    for (int a = 0; a < size; a++)
    {
        (values[a]).city = (char *) malloc(100 * sizeof(char));
        if(values[a].city == NULL)
        {
            MEM_ERROR;
            exit(100);
        }
    }

    while(fgets(s, sizeof(s), *fpData)!=NULL)
    {
        sscanf(s, "%[^:]%*c%d\n", values[index].city, &values[index].temp);
        index++;
    }

    sortInsertion(values, size, fpOutput);

    free(values);
    return;
}
void readData(文件**fpData,文件**fpOutput)
{
chars[100];
int指数=0;
放置*值;
值=malloc(大小*尺寸(位置));
如果(值==NULL)
{
记忆错误;
出口(1);
}
对于(int a=0;a
城市没有进入数组,所以我假设它显示值[index]的部分。城市是不正确的


如何修复此问题?

使用分号
处理您的数据
当您的
sscanf
使用冒号
格式化时,请确保这是相同的字符。如果数据确实使用分号,请将
sscanf
格式中的
%[^:][/code>部分更改为
%[^;]

下面是我的代码以及我如何运行它来向您展示它的工作原理:

#include <stdio.h>

struct Place {
    char city[100];
    int  temp;
} values[30];

int main() {
    char s[100];
    int i=0, n=0;
    while ( fgets(s, sizeof(s), stdin) != NULL ) {
        sscanf(s, "%[^;]%*c%d\n", values[n].city, &values[n].temp);
        n++;
    }
    printf("n=%d\n", n);

    for ( i=0; i<n; i++ ) {
        printf("values[%d] = (%s, %d)\n", i, values[i].city, values[i].temp);
    }
}

您的数据使用分号
当您的
sscanf
使用冒号
格式化时,请确保这是相同的字符。如果数据确实使用分号,请将
sscanf
格式中的
%[^:][/code>部分更改为
%[^;]

下面是我的代码以及我如何运行它来向您展示它的工作原理:

#include <stdio.h>

struct Place {
    char city[100];
    int  temp;
} values[30];

int main() {
    char s[100];
    int i=0, n=0;
    while ( fgets(s, sizeof(s), stdin) != NULL ) {
        sscanf(s, "%[^;]%*c%d\n", values[n].city, &values[n].temp);
        n++;
    }
    printf("n=%d\n", n);

    for ( i=0; i<n; i++ ) {
        printf("values[%d] = (%s, %d)\n", i, values[i].city, values[i].temp);
    }
}
这将把从读取的行首到第一个冒号(
)的所有内容复制到您分配的
city
数组中。您的示例输入似乎有一个分号(
),因此您将在
city
数组中获得整行,而在
temp
字段中没有任何内容

您不进行任何输入检查,因此任何过长的输入行都会被拆分为多个(可能已损坏)城市。如果文件中没有确切的
size
行,您也会遇到问题,因为您在读取时没有检查
index
以确保
size
没有经过
size
,并且您假设末尾有
size
条目而没有检查

这将把从读取的行首到第一个冒号(
)的所有内容复制到您分配的
city
数组中。您的示例输入似乎有一个分号(
),因此您将在
city
数组中获得整行,而在
temp
字段中没有任何内容


您不进行任何输入检查,因此任何过长的输入行都会被拆分为多个(可能已损坏)城市。如果文件中没有确切的
size
行,您也会遇到问题,因为您在阅读时没有检查
index
以确保
size
没有经过
size
,并且您假设末尾有
size
条目而没有检查。

@hii需要确保
city
的区域。另外,
“%[^:::%*c%d\n”
打字-->
删除sscanf,在“;”上使用拆分字符串并轻松引用两个数据字段。并应用一些验证,如@BLUEPIXY建议
Place*值仅定义指针。您需要将其更改为数组,如
放置值[100]
,或使用
malloc
。也类似于
字符*城市在结构内部。将其更改为
char city[100]
@hii只想确保您知道这一点。@hii需要确保
城市的区域。另外,
“%[^:::%*c%d\n”
打字-->
删除sscanf,在“;”上使用拆分字符串并轻松引用两个数据字段。并应用一些验证,如@BLUEPIXY建议
Place*值仅定义指针。您需要将其更改为数组,如
放置值[100]
,或使用
malloc
。也类似于
字符*城市在结构内部。将其更改为
char city[100]
@hii只是想确保您知道这一点。
sscanf(s, "%[^:]%*c%d\n", values[index].city, &values[index].temp);