c-得到警告:从指针转换为不同大小的整数,同时将字符串转换为整数数组并打印不相关的数字


#include <stdio.h>
#include <string.h>
typedef struct arrays {
char air[28];
char water[28];
char land[28];
char c9[28];
char c11[28];
char c13[28];
}arr;
int main()
{
FILE* fp = fopen("ass6file.csv", "r");
if (!fp)  {
printf("Can not open file");
return 0;
}
char buff[1024];
int row = 0;
int col = 0;
int i = 0;
arr value[999];
while (fgets(buff, 1024, fp))  {
col = 0;
row++;
if (row == 1)
continue;
char* column = strtok(buff, ",");
while (column)  {
if (col == 1)
strcpy(value[i].air, column);
if (col == 2)
strcpy(value[i].water, column);
if (col == 3)
strcpy(value[i].land, column);
if (col == 4)
strcpy(value[i].c9, column);
if (col == 5)
strcpy(value[i].c11, column);
if (col == 6)
strcpy(value[i].c13, column);
column = strtok(NULL, ",");
col++;
}
i++;
}
fclose(fp);
int sum1[28];
/*char sum1=0,sum2=0,sum3=0,sum4=0,sum5=0,sum6=0,k;
int var1,var2,var3,var4,var5,var6;
int m1,m2,m3,m4,m5,m6;
int s1=0,s2=0,s3=0,s4=0,s5=0,s6=0;*/
for (int k = 0; k < 28; k++)
sum1[k] = (int)value[k].air;
for (int k = 0; k < 28; k++)
printf("%dn", sum1[k]);
return 0;
}

我得到的警告是:

filh.c: In function ‘main’:
filh.c:62:11: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
62 |  sum1[k]= (int)value[k].air;
|           

我是C的新手。有人能帮它打印文件中没有的大数字吗?

1966677344
1966677512
1966677680
1966677848
1966678016
1966678184
1966678352
1966678520
1966678688
1966678856
1966679024
1966679192
1966679360
1966679528
1966679696
1966679864
1966680032
1966680200
1966680368
1966680536
1966680704
1966680872
1966681040
1966681208
1966681376
1966681544
1966681712
1966681880

您正在以char数组的形式从.csv文件中读取列。

但是,在求和时,你可能想将它们转换为int

仅仅将它们强制转换为int(例如使用(int)(是行不通的。

当您说:arr[i].air时,这是指向存储在air字段中的字符数据的指针

意外的是,编译器标记了这一点,因为您在64位机器上,int变量的大小是32位,但指针是64位

要将数字的字符串表示转换为实际数字(例如,我们想要一个int值(,我们需要使用atoi[或strtol]函数,而不是强制转换。

更改:

sum1[k] = (int) value[k].air;

进入:

sum1[k] = atoi(value[k].air);

更新:

我想对数组的元素进行算术运算,找到相应列的均值、方差等,文件与数据科学有关

好的。所以,我假设所有的输入数据都是数字。我们可以重构struct以使用整数。这意味着我们可以[使用atoi等]将数据存储为数字一次,然后对其进行多次操作,而不必为每次操作重新转换数据。

我假设输入值是整数。如果它们中的一些/全部可以是分数的(例如4.37(,我们可以在下面的示例代码中定义INPUT_IS_FLOAT

你的程序可以工作,但它将小数转换为整数,这不会给我准确的结果,因为我想计算平均值和其他东西,数据不会保持准确的

使用浮点变量求和、均值、方差等可以很容易地解决这一问题。无论输入数据存储为整数还是浮点数,这都会起作用

以下是一些重构代码,用于计算air列的和和和平均值。您可以为其他字段/列添加类似的代码。或者,无论你需要计算什么值:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef INPUT_IS_FLOAT
typedef double data_t;
#else
typedef long long data_t;
#endif
typedef struct arrays {
data_t air;
data_t water;
data_t land;
data_t c9;
data_t c11;
data_t c13;
} arr;
int
main()
{
FILE *fp = fopen("ass6file.csv", "r");
if (! fp) {
printf("Can not open file");
return 0;
}
char buff[1024];
int count = 0;
int col;
arr value[999];
arr *acur;
// skip over column headers
fgets(buff, sizeof(buff), fp);
while (fgets(buff, sizeof(buff), fp)) {
acur = &value[count++];
col = 0;
char *column = strtok(buff, ",");
while (column) {
#ifdef INPUT_IS_FLOAT
data_t curval = strtod(column,NULL,10);
#else
data_t curval = strtoll(column,NULL,10);
#endif
switch (col) {
case 1:
acur->air = curval;
break;
case 2:
acur->water = curval;
break;
case 3:
acur->land = curval;
break;
case 4:
acur->c9 = curval;
break;
case 5:
acur->c11 = curval;
break;
case 6:
acur->c13 = curval;
break;
}
column = strtok(NULL, ",");
col++;
}
}
fclose(fp);
// sum all 'air' elements
double sum = 0;
for (acur = &value[0];  acur < &value[count];  ++acur)
sum += acur->air;
printf("sum of air: %gn",sum);
double mean = sum / count;
printf("mean of air: %gn",mean);
return 0;
}

最新更新