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);